@google/gemini-cli 0.9.0-nightly.20250926.1487841d → 0.9.0-nightly.20251001.14dbda91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -54
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions/new.test.js +4 -3
- package/dist/src/commands/extensions/new.test.js.map +1 -1
- package/dist/src/commands/extensions/update.js +18 -4
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/list.js +3 -2
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/config/config.d.ts +3 -2
- package/dist/src/config/config.js +52 -47
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/extension.d.ts +6 -4
- package/dist/src/config/extension.js +40 -58
- package/dist/src/config/extension.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.d.ts +12 -9
- package/dist/src/config/extensions/extensionEnablement.js +37 -9
- package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
- package/dist/src/config/extensions/extensionEnablement.test.js +72 -0
- package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
- package/dist/src/config/extensions/github.js +7 -4
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/update.d.ts +4 -5
- package/dist/src/config/extensions/update.js +54 -40
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +84 -69
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/settings.js +1 -0
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +21 -3
- package/dist/src/config/settingsSchema.js +20 -2
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +9 -1
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/gemini.js +8 -7
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -1
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/test-utils/render.d.ts +3 -1
- package/dist/src/test-utils/render.js +4 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/App.js +7 -9
- package/dist/src/ui/App.js.map +1 -1
- package/dist/src/ui/AppContainer.js +47 -9
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +269 -7
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.js +3 -0
- package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.js +8 -1
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +1 -0
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +14 -10
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/mcpCommand.js +78 -260
- package/dist/src/ui/commands/mcpCommand.js.map +1 -1
- package/dist/src/ui/commands/toolsCommand.js +10 -24
- package/dist/src/ui/commands/toolsCommand.js.map +1 -1
- package/dist/src/ui/commands/types.d.ts +6 -5
- package/dist/src/ui/commands/types.js.map +1 -1
- package/dist/src/ui/components/Composer.js +4 -21
- package/dist/src/ui/components/Composer.js.map +1 -1
- package/dist/src/ui/components/ConsentPrompt.d.ts +13 -0
- package/dist/src/ui/components/ConsentPrompt.js +19 -0
- package/dist/src/ui/components/ConsentPrompt.js.map +1 -0
- package/dist/src/ui/components/ConsentPrompt.test.d.ts +6 -0
- package/dist/src/ui/components/ConsentPrompt.test.js +67 -0
- package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -0
- package/dist/src/ui/components/DialogManager.d.ts +2 -1
- package/dist/src/ui/components/DialogManager.js +9 -9
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/EditorSettingsDialog.js +11 -2
- package/dist/src/ui/components/EditorSettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ExitWarning.d.ts +7 -0
- package/dist/src/ui/components/ExitWarning.js +9 -0
- package/dist/src/ui/components/ExitWarning.js.map +1 -0
- package/dist/src/ui/components/FolderTrustDialog.js +3 -0
- package/dist/src/ui/components/FolderTrustDialog.js.map +1 -1
- package/dist/src/ui/components/Footer.d.ts +1 -19
- package/dist/src/ui/components/Footer.js +28 -2
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Help.js +1 -1
- package/dist/src/ui/components/Help.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.d.ts +1 -0
- package/dist/src/ui/components/HistoryItemDisplay.js +5 -2
- package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
- package/dist/src/ui/components/HistoryItemDisplay.test.js +50 -10
- package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
- package/dist/src/ui/components/IdeTrustChangeDialog.d.ts +11 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js +32 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.js.map +1 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.d.ts +6 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js +57 -0
- package/dist/src/ui/components/IdeTrustChangeDialog.test.js.map +1 -0
- package/dist/src/ui/components/InputPrompt.d.ts +6 -0
- package/dist/src/ui/components/InputPrompt.js +43 -13
- package/dist/src/ui/components/InputPrompt.js.map +1 -1
- package/dist/src/ui/components/LoopDetectionConfirmation.js +2 -0
- package/dist/src/ui/components/LoopDetectionConfirmation.js.map +1 -1
- package/dist/src/ui/components/MainContent.js +6 -1
- package/dist/src/ui/components/MainContent.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.js +4 -0
- package/dist/src/ui/components/ModelDialog.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js +3 -0
- package/dist/src/ui/components/PermissionsModifyTrustDialog.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +0 -4
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.js +2 -0
- package/dist/src/ui/components/ProQuotaDialog.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +2 -0
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.js +5 -2
- package/dist/src/ui/components/SettingsDialog.js.map +1 -1
- package/dist/src/ui/components/ShellConfirmationDialog.js +3 -0
- package/dist/src/ui/components/ShellConfirmationDialog.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.js +2 -0
- package/dist/src/ui/components/ThemeDialog.js.map +1 -1
- package/dist/src/ui/components/WorkspaceMigrationDialog.js +2 -2
- package/dist/src/ui/components/WorkspaceMigrationDialog.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +14 -0
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.js +24 -1
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/UserMessage.js +1 -2
- package/dist/src/ui/components/messages/UserMessage.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.d.ts +5 -10
- package/dist/src/ui/components/shared/BaseSelectionList.js +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +7 -5
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.d.ts +2 -3
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js +13 -2
- package/dist/src/ui/components/shared/DescriptiveRadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.d.ts +2 -3
- package/dist/src/ui/components/shared/RadioButtonSelect.js +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.js.map +1 -1
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js +5 -3
- package/dist/src/ui/components/shared/RadioButtonSelect.test.js.map +1 -1
- package/dist/src/ui/components/shared/ScopeSelector.js +4 -1
- package/dist/src/ui/components/shared/ScopeSelector.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.d.ts +27 -0
- package/dist/src/ui/components/views/McpStatus.js +77 -0
- package/dist/src/ui/components/views/McpStatus.js.map +1 -0
- package/dist/src/ui/components/views/McpStatus.test.d.ts +6 -0
- package/dist/src/ui/components/views/McpStatus.test.js +117 -0
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.d.ts +14 -0
- package/dist/src/ui/components/views/ToolsList.js +7 -0
- package/dist/src/ui/components/views/ToolsList.js.map +1 -0
- package/dist/src/ui/components/views/ToolsList.test.d.ts +6 -0
- package/dist/src/ui/components/views/ToolsList.test.js +45 -0
- package/dist/src/ui/components/views/ToolsList.test.js.map +1 -0
- package/dist/src/ui/contexts/UIStateContext.d.ts +4 -1
- package/dist/src/ui/contexts/UIStateContext.js +1 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.d.ts +5 -5
- package/dist/src/ui/hooks/slashCommandProcessor.js +4 -2
- package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +10 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js +97 -51
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +158 -80
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.d.ts +4 -2
- package/dist/src/ui/hooks/useIdeTrustListener.js +40 -14
- package/dist/src/ui/hooks/useIdeTrustListener.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.test.d.ts +6 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js +183 -0
- package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -0
- package/dist/src/ui/hooks/useSelectionList.d.ts +1 -0
- package/dist/src/ui/hooks/useSelectionList.js +63 -43
- package/dist/src/ui/hooks/useSelectionList.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.test.js +111 -37
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +2 -2
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/layouts/DefaultAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js +13 -0
- package/dist/src/ui/layouts/DefaultAppLayout.js.map +1 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.d.ts +7 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js +14 -0
- package/dist/src/ui/layouts/ScreenReaderAppLayout.js.map +1 -0
- package/dist/src/ui/noninteractive/nonInteractiveUi.js +2 -1
- package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -1
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js +2 -2
- package/dist/src/ui/privacy/CloudFreePrivacyNotice.js.map +1 -1
- package/dist/src/ui/state/extensions.d.ts +27 -0
- package/dist/src/ui/state/extensions.js +45 -0
- package/dist/src/ui/state/extensions.js.map +1 -1
- package/dist/src/ui/types.d.ts +45 -3
- package/dist/src/ui/types.js +2 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.js +1 -2
- package/dist/src/ui/utils/MarkdownDisplay.js.map +1 -1
- package/dist/src/ui/utils/MarkdownDisplay.test.js +94 -91
- package/dist/src/ui/utils/MarkdownDisplay.test.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.d.ts +1 -0
- package/dist/src/ui/utils/displayUtils.js +3 -0
- package/dist/src/ui/utils/displayUtils.js.map +1 -1
- package/dist/src/ui/utils/displayUtils.test.js +36 -17
- package/dist/src/ui/utils/displayUtils.test.js.map +1 -1
- package/dist/src/utils/windowTitle.d.ts +12 -0
- package/dist/src/utils/windowTitle.js +19 -0
- package/dist/src/utils/windowTitle.js.map +1 -0
- package/dist/src/utils/windowTitle.test.d.ts +6 -0
- package/dist/src/utils/windowTitle.test.js +49 -0
- package/dist/src/utils/windowTitle.test.js.map +1 -0
- package/dist/src/zed-integration/fileSystemService.d.ts +1 -0
- package/dist/src/zed-integration/fileSystemService.js +3 -0
- package/dist/src/zed-integration/fileSystemService.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +1 -1
- package/dist/src/zed-integration/zedIntegration.js +3 -1
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -11,12 +11,12 @@ Gemini CLI is an open-source AI agent that brings the power of Gemini directly i
|
|
|
11
11
|
|
|
12
12
|
## 🚀 Why Gemini CLI?
|
|
13
13
|
|
|
14
|
-
- **🎯 Free tier**: 60 requests/min and 1,000 requests/day with personal Google account
|
|
15
|
-
- **🧠 Powerful Gemini 2.5 Pro**: Access to 1M token context window
|
|
16
|
-
- **🔧 Built-in tools**: Google Search grounding, file operations, shell commands, web fetching
|
|
17
|
-
- **🔌 Extensible**: MCP (Model Context Protocol) support for custom integrations
|
|
18
|
-
- **💻 Terminal-first**: Designed for developers who live in the command line
|
|
19
|
-
- **🛡️ Open source**: Apache 2.0 licensed
|
|
14
|
+
- **🎯 Free tier**: 60 requests/min and 1,000 requests/day with personal Google account.
|
|
15
|
+
- **🧠 Powerful Gemini 2.5 Pro**: Access to 1M token context window.
|
|
16
|
+
- **🔧 Built-in tools**: Google Search grounding, file operations, shell commands, web fetching.
|
|
17
|
+
- **🔌 Extensible**: MCP (Model Context Protocol) support for custom integrations.
|
|
18
|
+
- **💻 Terminal-first**: Designed for developers who live in the command line.
|
|
19
|
+
- **🛡️ Open source**: Apache 2.0 licensed.
|
|
20
20
|
|
|
21
21
|
## 📦 Installation
|
|
22
22
|
|
|
@@ -109,20 +109,14 @@ Choose the authentication method that best fits your needs:
|
|
|
109
109
|
|
|
110
110
|
### Option 1: Login with Google (OAuth login using your Google Account)
|
|
111
111
|
|
|
112
|
-
**✨ Best for:**
|
|
113
|
-
|
|
114
|
-
- Individual developers.
|
|
115
|
-
- Google AI Pro and AI Ultra subscribers.
|
|
116
|
-
- Anyone who has a Gemini Code Assist license.
|
|
117
|
-
|
|
118
|
-
_See [quota limits and terms of service](https://cloud.google.com/gemini/docs/quotas) for details._
|
|
112
|
+
**✨ Best for:** Individual developers as well as anyone who has a Gemini Code Assist License. (see [quota limits and terms of service](https://cloud.google.com/gemini/docs/quotas) for details)
|
|
119
113
|
|
|
120
114
|
**Benefits:**
|
|
121
115
|
|
|
122
|
-
- **Free tier
|
|
123
|
-
- **Gemini 2.5 Pro
|
|
116
|
+
- **Free tier**: 60 requests/min and 1,000 requests/day
|
|
117
|
+
- **Gemini 2.5 Pro** with 1M token context window
|
|
124
118
|
- **No API key management** - just sign in with your Google account
|
|
125
|
-
- **Automatic updates** to
|
|
119
|
+
- **Automatic updates** to latest models
|
|
126
120
|
|
|
127
121
|
#### Start Gemini CLI, then choose _Login with Google_ and follow the browser authentication flow when prompted
|
|
128
122
|
|
|
@@ -171,7 +165,7 @@ export GOOGLE_GENAI_USE_VERTEXAI=true
|
|
|
171
165
|
gemini
|
|
172
166
|
```
|
|
173
167
|
|
|
174
|
-
For Google Workspace accounts and other authentication methods, see the [authentication guide](./docs/
|
|
168
|
+
For Google Workspace accounts and other authentication methods, see the [authentication guide](./docs/get-started/authentication.md).
|
|
175
169
|
|
|
176
170
|
## 🚀 Getting Started
|
|
177
171
|
|
|
@@ -233,17 +227,18 @@ gemini
|
|
|
233
227
|
|
|
234
228
|
### Getting Started
|
|
235
229
|
|
|
236
|
-
- [**Quickstart Guide**](./docs/
|
|
237
|
-
- [**Authentication Setup**](./docs/
|
|
238
|
-
- [**Configuration Guide**](./docs/
|
|
239
|
-
- [**Keyboard Shortcuts**](./docs/keyboard-shortcuts.md) - Productivity tips
|
|
230
|
+
- [**Quickstart Guide**](./docs/get-started/index.md) - Get up and running quickly.
|
|
231
|
+
- [**Authentication Setup**](./docs/get-started/authentication.md) - Detailed auth configuration.
|
|
232
|
+
- [**Configuration Guide**](./docs/get-started/configuration.md) - Settings and customization.
|
|
233
|
+
- [**Keyboard Shortcuts**](./docs/cli/keyboard-shortcuts.md) - Productivity tips.
|
|
240
234
|
|
|
241
235
|
### Core Features
|
|
242
236
|
|
|
243
|
-
- [**Commands Reference**](./docs/cli/commands.md) - All slash commands (`/help`, `/chat`,
|
|
244
|
-
- [**
|
|
245
|
-
- [**
|
|
246
|
-
- [**
|
|
237
|
+
- [**Commands Reference**](./docs/cli/commands.md) - All slash commands (`/help`, `/chat`, etc).
|
|
238
|
+
- [**Custom Commands**](./docs/cli/custom-commands.md) - Create your own reusable commands.
|
|
239
|
+
- [**Context Files (GEMINI.md)**](./docs/cli/gemini-md.md) - Provide persistent context to Gemini CLI.
|
|
240
|
+
- [**Checkpointing**](./docs/cli/checkpointing.md) - Save and resume conversations.
|
|
241
|
+
- [**Token Caching**](./docs/cli/token-caching.md) - Optimize token usage.
|
|
247
242
|
|
|
248
243
|
### Tools & Extensions
|
|
249
244
|
|
|
@@ -251,31 +246,25 @@ gemini
|
|
|
251
246
|
- [File System Operations](./docs/tools/file-system.md)
|
|
252
247
|
- [Shell Commands](./docs/tools/shell.md)
|
|
253
248
|
- [Web Fetch & Search](./docs/tools/web-fetch.md)
|
|
254
|
-
|
|
255
|
-
- [**
|
|
256
|
-
- [**Custom Extensions**](./docs/extension.md) - Build your own commands
|
|
249
|
+
- [**MCP Server Integration**](./docs/tools/mcp-server.md) - Extend with custom tools.
|
|
250
|
+
- [**Custom Extensions**](./docs/extensions/index.md) - Build and share your own commands.
|
|
257
251
|
|
|
258
252
|
### Advanced Topics
|
|
259
253
|
|
|
260
|
-
- [**
|
|
261
|
-
- [**
|
|
262
|
-
- [**
|
|
263
|
-
- [**
|
|
264
|
-
- [**
|
|
265
|
-
- [**
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
- [**Settings Reference**](./docs/cli/configuration.md) - All configuration options
|
|
270
|
-
- [**Theme Customization**](./docs/cli/themes.md) - Visual customization
|
|
271
|
-
- [**.gemini Directory**](./docs/gemini-ignore.md) - Project-specific settings
|
|
272
|
-
- [**Environment Variables**](./docs/cli/configuration.md#environment-variables)
|
|
254
|
+
- [**Headless Mode (Scripting)**](./docs/cli/headless.md) - Use Gemini CLI in automated workflows.
|
|
255
|
+
- [**Architecture Overview**](./docs/architecture.md) - How Gemini CLI works.
|
|
256
|
+
- [**IDE Integration**](./docs/ide-integration/index.md) - VS Code companion.
|
|
257
|
+
- [**Sandboxing & Security**](./docs/cli/sandbox.md) - Safe execution environments.
|
|
258
|
+
- [**Trusted Folders**](./docs/cli/trusted-folders.md) - Control execution policies by folder.
|
|
259
|
+
- [**Enterprise Guide**](./docs/cli/enterprise.md) - Deploy and manage in a corporate environment.
|
|
260
|
+
- [**Telemetry & Monitoring**](./docs/cli/telemetry.md) - Usage tracking.
|
|
261
|
+
- [**Tools API Development**](./docs/core/tools-api.md) - Create custom tools.
|
|
273
262
|
|
|
274
263
|
### Troubleshooting & Support
|
|
275
264
|
|
|
276
|
-
- [**Troubleshooting Guide**](./docs/troubleshooting.md) - Common issues and solutions
|
|
277
|
-
- [**FAQ**](./docs/
|
|
278
|
-
- Use `/bug` command to report issues directly from the CLI
|
|
265
|
+
- [**Troubleshooting Guide**](./docs/troubleshooting.md) - Common issues and solutions.
|
|
266
|
+
- [**FAQ**](./docs/faq.md) - Frequently asked questions.
|
|
267
|
+
- Use `/bug` command to report issues directly from the CLI.
|
|
279
268
|
|
|
280
269
|
### Using MCP Servers
|
|
281
270
|
|
|
@@ -293,25 +282,25 @@ See the [MCP Server Integration guide](./docs/tools/mcp-server.md) for setup ins
|
|
|
293
282
|
|
|
294
283
|
We welcome contributions! Gemini CLI is fully open source (Apache 2.0), and we encourage the community to:
|
|
295
284
|
|
|
296
|
-
- Report bugs and suggest features
|
|
297
|
-
- Improve documentation
|
|
298
|
-
- Submit code improvements
|
|
299
|
-
- Share your MCP servers and extensions
|
|
285
|
+
- Report bugs and suggest features.
|
|
286
|
+
- Improve documentation.
|
|
287
|
+
- Submit code improvements.
|
|
288
|
+
- Share your MCP servers and extensions.
|
|
300
289
|
|
|
301
290
|
See our [Contributing Guide](./CONTRIBUTING.md) for development setup, coding standards, and how to submit pull requests.
|
|
302
291
|
|
|
303
|
-
Check our [Official Roadmap](https://github.com/orgs/google-gemini/projects/11
|
|
292
|
+
Check our [Official Roadmap](https://github.com/orgs/google-gemini/projects/11) for planned features and priorities.
|
|
304
293
|
|
|
305
294
|
## 📖 Resources
|
|
306
295
|
|
|
307
|
-
- **[Official Roadmap](./ROADMAP.md)** - See what's coming next
|
|
308
|
-
- **[NPM Package](https://www.npmjs.com/package/@google/gemini-cli)** - Package registry
|
|
309
|
-
- **[GitHub Issues](https://github.com/google-gemini/gemini-cli/issues)** - Report bugs or request features
|
|
310
|
-
- **[Security Advisories](https://github.com/google-gemini/gemini-cli/security/advisories)** - Security updates
|
|
296
|
+
- **[Official Roadmap](./ROADMAP.md)** - See what's coming next.
|
|
297
|
+
- **[NPM Package](https://www.npmjs.com/package/@google/gemini-cli)** - Package registry.
|
|
298
|
+
- **[GitHub Issues](https://github.com/google-gemini/gemini-cli/issues)** - Report bugs or request features.
|
|
299
|
+
- **[Security Advisories](https://github.com/google-gemini/gemini-cli/security/advisories)** - Security updates.
|
|
311
300
|
|
|
312
301
|
### Uninstall
|
|
313
302
|
|
|
314
|
-
See the [Uninstall Guide](docs/
|
|
303
|
+
See the [Uninstall Guide](docs/cli/uninstall.md) for removal instructions.
|
|
315
304
|
|
|
316
305
|
## 📄 Legal
|
|
317
306
|
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@google/gemini-cli",
|
|
3
|
-
"version": "0.9.0-nightly.
|
|
3
|
+
"version": "0.9.0-nightly.20251001.14dbda91",
|
|
4
4
|
"description": "Gemini CLI",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"config": {
|
|
28
|
-
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.9.0-nightly.
|
|
28
|
+
"sandboxImageUri": "us-docker.pkg.dev/gemini-code-dev/gemini-cli/sandbox:0.9.0-nightly.20251001.14dbda91"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@google/gemini-cli-core": "file:../core",
|
|
@@ -7,6 +7,7 @@ import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
7
7
|
import { newCommand } from './new.js';
|
|
8
8
|
import yargs from 'yargs';
|
|
9
9
|
import * as fsPromises from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
10
11
|
vi.mock('node:fs/promises');
|
|
11
12
|
const mockedFs = vi.mocked(fsPromises);
|
|
12
13
|
describe('extensions new command', () => {
|
|
@@ -37,9 +38,9 @@ describe('extensions new command', () => {
|
|
|
37
38
|
expect(mockedFs.mkdir).toHaveBeenCalledWith('/some/path', {
|
|
38
39
|
recursive: true,
|
|
39
40
|
});
|
|
40
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/context'), '/some/path/context', { recursive: true });
|
|
41
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/custom-commands'), '/some/path/custom-commands', { recursive: true });
|
|
42
|
-
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining('context/mcp-server'), '/some/path/mcp-server', { recursive: true });
|
|
41
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/context')), path.normalize('/some/path/context'), { recursive: true });
|
|
42
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/custom-commands')), path.normalize('/some/path/custom-commands'), { recursive: true });
|
|
43
|
+
expect(mockedFs.cp).toHaveBeenCalledWith(expect.stringContaining(path.normalize('context/mcp-server')), path.normalize('/some/path/mcp-server'), { recursive: true });
|
|
43
44
|
});
|
|
44
45
|
it('should throw an error if the path already exists', async () => {
|
|
45
46
|
mockedFs.access.mockResolvedValue(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"new.test.js","sourceRoot":"","sources":["../../../../src/commands/extensions/new.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { loadExtensions, annotateActiveExtensions, requestConsentNonInteractive, } from '../../config/extension.js';
|
|
6
|
+
import { loadExtensions, annotateActiveExtensions, ExtensionStorage, requestConsentNonInteractive, } from '../../config/extension.js';
|
|
7
7
|
import { updateAllUpdatableExtensions, checkForAllExtensionUpdates, updateExtension, } from '../../config/extensions/update.js';
|
|
8
8
|
import { checkForExtensionUpdate } from '../../config/extensions/github.js';
|
|
9
9
|
import { getErrorMessage } from '../../utils/errors.js';
|
|
10
10
|
import { ExtensionUpdateState } from '../../ui/state/extensions.js';
|
|
11
|
+
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
|
|
11
12
|
const updateOutput = (info) => `Extension "${info.name}" successfully updated: ${info.originalVersion} → ${info.updatedVersion}.`;
|
|
12
13
|
export async function handleUpdate(args) {
|
|
13
14
|
const workingDir = process.cwd();
|
|
14
|
-
const
|
|
15
|
-
|
|
15
|
+
const extensionEnablementManager = new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir(),
|
|
16
|
+
// Force enable named extensions, otherwise we will only update the enabled
|
|
17
|
+
// ones.
|
|
18
|
+
args.name ? [args.name] : []);
|
|
19
|
+
const allExtensions = loadExtensions(extensionEnablementManager);
|
|
20
|
+
const extensions = annotateActiveExtensions(allExtensions, workingDir, extensionEnablementManager);
|
|
16
21
|
if (args.name) {
|
|
17
22
|
try {
|
|
18
23
|
const extension = extensions.find((extension) => extension.name === args.name);
|
|
@@ -48,7 +53,16 @@ export async function handleUpdate(args) {
|
|
|
48
53
|
}
|
|
49
54
|
if (args.all) {
|
|
50
55
|
try {
|
|
51
|
-
|
|
56
|
+
const extensionState = new Map();
|
|
57
|
+
await checkForAllExtensionUpdates(extensions, (action) => {
|
|
58
|
+
if (action.type === 'SET_STATE') {
|
|
59
|
+
extensionState.set(action.payload.name, {
|
|
60
|
+
status: action.payload.state,
|
|
61
|
+
processed: true, // No need to process as we will force the update.
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
let updateInfos = await updateAllUpdatableExtensions(workingDir, requestConsentNonInteractive, extensions, extensionState, () => { });
|
|
52
66
|
updateInfos = updateInfos.filter((info) => info.originalVersion !== info.updatedVersion);
|
|
53
67
|
if (updateInfos.length === 0) {
|
|
54
68
|
console.log('No extensions to update.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/extensions/update.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,4BAA4B,EAE5B,2BAA2B,EAC3B,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/commands/extensions/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,15 @@
|
|
|
6
6
|
import { loadSettings } from '../../config/settings.js';
|
|
7
7
|
import { MCPServerStatus, createTransport } from '@google/gemini-cli-core';
|
|
8
8
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
9
|
-
import { loadExtensions } from '../../config/extension.js';
|
|
9
|
+
import { ExtensionStorage, loadExtensions } from '../../config/extension.js';
|
|
10
|
+
import { ExtensionEnablementManager } from '../../config/extensions/extensionEnablement.js';
|
|
10
11
|
const COLOR_GREEN = '\u001b[32m';
|
|
11
12
|
const COLOR_YELLOW = '\u001b[33m';
|
|
12
13
|
const COLOR_RED = '\u001b[31m';
|
|
13
14
|
const RESET_COLOR = '\u001b[0m';
|
|
14
15
|
async function getMcpServersFromConfig() {
|
|
15
16
|
const settings = loadSettings();
|
|
16
|
-
const extensions = loadExtensions();
|
|
17
|
+
const extensions = loadExtensions(new ExtensionEnablementManager(ExtensionStorage.getUserExtensionsDir()));
|
|
17
18
|
const mcpServers = { ...(settings.merged.mcpServers || {}) };
|
|
18
19
|
for (const extension of extensions) {
|
|
19
20
|
Object.entries(extension.config.mcpServers || {}).forEach(([key, server]) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/mcp/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/commands/mcp/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,9 @@ import type { FileFilteringOptions } from '@google/gemini-cli-core';
|
|
|
7
7
|
import { Config, FileDiscoveryService } from '@google/gemini-cli-core';
|
|
8
8
|
import type { Settings } from './settings.js';
|
|
9
9
|
import type { Extension } from './extension.js';
|
|
10
|
+
import type { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
|
|
10
11
|
export interface CliArgs {
|
|
12
|
+
query: string | undefined;
|
|
11
13
|
model: string | undefined;
|
|
12
14
|
sandbox: boolean | string | undefined;
|
|
13
15
|
sandboxImage: string | undefined;
|
|
@@ -35,7 +37,6 @@ export interface CliArgs {
|
|
|
35
37
|
screenReader: boolean | undefined;
|
|
36
38
|
useSmartEdit: boolean | undefined;
|
|
37
39
|
useWriteTodos: boolean | undefined;
|
|
38
|
-
promptWords: string[] | undefined;
|
|
39
40
|
outputFormat: string | undefined;
|
|
40
41
|
}
|
|
41
42
|
export declare function parseArguments(settings: Settings): Promise<CliArgs>;
|
|
@@ -44,4 +45,4 @@ export declare function loadHierarchicalGeminiMemory(currentWorkingDirectory: st
|
|
|
44
45
|
fileCount: number;
|
|
45
46
|
}>;
|
|
46
47
|
export declare function isDebugMode(argv: CliArgs): boolean;
|
|
47
|
-
export declare function loadCliConfig(settings: Settings, extensions: Extension[], sessionId: string, argv: CliArgs, cwd?: string): Promise<Config>;
|
|
48
|
+
export declare function loadCliConfig(settings: Settings, extensions: Extension[], extensionEnablementManager: ExtensionEnablementManager, sessionId: string, argv: CliArgs, cwd?: string): Promise<Config>;
|
|
@@ -11,7 +11,7 @@ import { hideBin } from 'yargs/helpers';
|
|
|
11
11
|
import process from 'node:process';
|
|
12
12
|
import { mcpCommand } from '../commands/mcp.js';
|
|
13
13
|
import { extensionsCommand } from '../commands/extensions.js';
|
|
14
|
-
import { Config, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, ShellTool, EditTool, WriteFileTool,
|
|
14
|
+
import { Config, loadServerHierarchicalMemory, setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MODEL_AUTO, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, ShellTool, EditTool, WriteFileTool, resolveTelemetrySettings, FatalConfigError, } from '@google/gemini-cli-core';
|
|
15
15
|
import { annotateActiveExtensions } from './extension.js';
|
|
16
16
|
import { getCliVersion } from '../utils/version.js';
|
|
17
17
|
import { loadSandboxConfig } from './sandboxConfig.js';
|
|
@@ -29,7 +29,8 @@ const logger = {
|
|
|
29
29
|
error: (...args) => console.error('[ERROR]', ...args),
|
|
30
30
|
};
|
|
31
31
|
export async function parseArguments(settings) {
|
|
32
|
-
const
|
|
32
|
+
const rawArgv = hideBin(process.argv);
|
|
33
|
+
const yargsInstance = yargs(rawArgv)
|
|
33
34
|
.locale('en')
|
|
34
35
|
.scriptName('gemini')
|
|
35
36
|
.usage('Usage: gemini [options] [command]\n\nGemini CLI - Launch an interactive CLI, use -p/--prompt for non-interactive mode')
|
|
@@ -76,7 +77,10 @@ export async function parseArguments(settings) {
|
|
|
76
77
|
description: 'Proxy for gemini client, like schema://user:password@host:port',
|
|
77
78
|
})
|
|
78
79
|
.deprecateOption('proxy', 'Use the "proxy" setting in settings.json instead. This flag will be removed in a future version.')
|
|
79
|
-
.command('$0 [
|
|
80
|
+
.command('$0 [query..]', 'Launch Gemini CLI', (yargsInstance) => yargsInstance
|
|
81
|
+
.positional('query', {
|
|
82
|
+
description: 'Positional prompt. Defaults to one-shot; use -i/--prompt-interactive for interactive.',
|
|
83
|
+
})
|
|
80
84
|
.option('model', {
|
|
81
85
|
alias: 'm',
|
|
82
86
|
type: 'string',
|
|
@@ -186,16 +190,27 @@ export async function parseArguments(settings) {
|
|
|
186
190
|
.deprecateOption('checkpointing', 'Use the "general.checkpointing.enabled" setting in settings.json instead. This flag will be removed in a future version.')
|
|
187
191
|
.deprecateOption('all-files', 'Use @ includes in the application instead. This flag will be removed in a future version.')
|
|
188
192
|
.deprecateOption('prompt', 'Use the positional prompt instead. This flag will be removed in a future version.')
|
|
193
|
+
// Ensure validation flows through .fail() for clean UX
|
|
194
|
+
.fail((msg, err, yargs) => {
|
|
195
|
+
console.error(msg || err?.message || 'Unknown error');
|
|
196
|
+
yargs.showHelp();
|
|
197
|
+
process.exit(1);
|
|
198
|
+
})
|
|
189
199
|
.check((argv) => {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
200
|
+
// The 'query' positional can be a string (for one arg) or string[] (for multiple).
|
|
201
|
+
// This guard safely checks if any positional argument was provided.
|
|
202
|
+
const query = argv['query'];
|
|
203
|
+
const hasPositionalQuery = Array.isArray(query)
|
|
204
|
+
? query.length > 0
|
|
205
|
+
: !!query;
|
|
206
|
+
if (argv['prompt'] && hasPositionalQuery) {
|
|
207
|
+
return 'Cannot use both a positional prompt and the --prompt (-p) flag together';
|
|
193
208
|
}
|
|
194
209
|
if (argv['prompt'] && argv['promptInteractive']) {
|
|
195
|
-
|
|
210
|
+
return 'Cannot use both --prompt (-p) and --prompt-interactive (-i) together';
|
|
196
211
|
}
|
|
197
212
|
if (argv.yolo && argv['approvalMode']) {
|
|
198
|
-
|
|
213
|
+
return 'Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.';
|
|
199
214
|
}
|
|
200
215
|
return true;
|
|
201
216
|
}))
|
|
@@ -213,6 +228,7 @@ export async function parseArguments(settings) {
|
|
|
213
228
|
.demandCommand(0, 0); // Allow base command to run with no subcommands
|
|
214
229
|
yargsInstance.wrap(yargsInstance.terminalWidth());
|
|
215
230
|
const result = await yargsInstance.parse();
|
|
231
|
+
// If yargs handled --help/--version it will have exited; nothing to do here.
|
|
216
232
|
// Handle case where MCP subcommands are executed - they should exit the process
|
|
217
233
|
// and not return to main CLI logic
|
|
218
234
|
if (result._.length > 0 &&
|
|
@@ -220,6 +236,23 @@ export async function parseArguments(settings) {
|
|
|
220
236
|
// MCP commands handle their own execution and process exit
|
|
221
237
|
process.exit(0);
|
|
222
238
|
}
|
|
239
|
+
// Normalize query args: handle both quoted "@path file" and unquoted @path file
|
|
240
|
+
const queryArg = result.query;
|
|
241
|
+
const q = Array.isArray(queryArg)
|
|
242
|
+
? queryArg.join(' ')
|
|
243
|
+
: queryArg;
|
|
244
|
+
// Route positional args: explicit -i flag -> interactive; else -> one-shot (even for @commands)
|
|
245
|
+
if (q && !result['prompt']) {
|
|
246
|
+
const hasExplicitInteractive = result['promptInteractive'] === '' || !!result['promptInteractive'];
|
|
247
|
+
if (hasExplicitInteractive) {
|
|
248
|
+
result['promptInteractive'] = q;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
result['prompt'] = q;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Keep CliArgs.query as a string for downstream typing
|
|
255
|
+
result['query'] = q || undefined;
|
|
223
256
|
// The import format is now only controlled by settings.memoryImportFormat
|
|
224
257
|
// We no longer accept it as a CLI argument
|
|
225
258
|
return result;
|
|
@@ -241,41 +274,17 @@ export async function loadHierarchicalGeminiMemory(currentWorkingDirectory, incl
|
|
|
241
274
|
// Directly call the server function with the corrected path.
|
|
242
275
|
return loadServerHierarchicalMemory(effectiveCwd, includeDirectoriesToReadGemini, debugMode, fileService, extensionContextFilePaths, folderTrust, memoryImportFormat, fileFilteringOptions, settings.context?.discoveryMaxDirs);
|
|
243
276
|
}
|
|
244
|
-
/**
|
|
245
|
-
* Creates a filter function to determine if a tool should be excluded.
|
|
246
|
-
*
|
|
247
|
-
* In non-interactive mode, we want to disable tools that require user
|
|
248
|
-
* interaction to prevent the CLI from hanging. This function creates a predicate
|
|
249
|
-
* that returns `true` if a tool should be excluded.
|
|
250
|
-
*
|
|
251
|
-
* A tool is excluded if it's not in the `allowedToolsSet`. The shell tool
|
|
252
|
-
* has a special case: it's not excluded if any of its subcommands
|
|
253
|
-
* are in the `allowedTools` list.
|
|
254
|
-
*
|
|
255
|
-
* @param allowedTools A list of explicitly allowed tool names.
|
|
256
|
-
* @param allowedToolsSet A set of explicitly allowed tool names for quick lookups.
|
|
257
|
-
* @returns A function that takes a tool name and returns `true` if it should be excluded.
|
|
258
|
-
*/
|
|
259
|
-
function createToolExclusionFilter(allowedTools, allowedToolsSet) {
|
|
260
|
-
return (tool) => {
|
|
261
|
-
if (tool === ShellTool.Name) {
|
|
262
|
-
// If any of the allowed tools is ShellTool (even with subcommands), don't exclude it.
|
|
263
|
-
return !allowedTools.some((allowed) => SHELL_TOOL_NAMES.some((shellName) => allowed.startsWith(shellName)));
|
|
264
|
-
}
|
|
265
|
-
return !allowedToolsSet.has(tool);
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
277
|
export function isDebugMode(argv) {
|
|
269
278
|
return (argv.debug ||
|
|
270
279
|
[process.env['DEBUG'], process.env['DEBUG_MODE']].some((v) => v === 'true' || v === '1'));
|
|
271
280
|
}
|
|
272
|
-
export async function loadCliConfig(settings, extensions, sessionId, argv, cwd = process.cwd()) {
|
|
281
|
+
export async function loadCliConfig(settings, extensions, extensionEnablementManager, sessionId, argv, cwd = process.cwd()) {
|
|
273
282
|
const debugMode = isDebugMode(argv);
|
|
274
283
|
const memoryImportFormat = settings.context?.importFormat || 'tree';
|
|
275
284
|
const ideMode = settings.ide?.enabled ?? false;
|
|
276
285
|
const folderTrust = settings.security?.folderTrust?.enabled ?? false;
|
|
277
286
|
const trustedFolder = isWorkspaceTrusted(settings)?.isTrusted ?? true;
|
|
278
|
-
const allExtensions = annotateActiveExtensions(extensions,
|
|
287
|
+
const allExtensions = annotateActiveExtensions(extensions, cwd, extensionEnablementManager);
|
|
279
288
|
const activeExtensions = extensions.filter((_, i) => allExtensions[i].isActive);
|
|
280
289
|
// Set the context filename in the server's memoryTool module BEFORE loading memory
|
|
281
290
|
// TODO(b/343434939): This is a bit of a hack. The contextFileName should ideally be passed
|
|
@@ -302,7 +311,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
302
311
|
? includeDirectories
|
|
303
312
|
: [], debugMode, fileService, settings, extensionContextFilePaths, trustedFolder, memoryImportFormat, fileFiltering);
|
|
304
313
|
let mcpServers = mergeMcpServers(settings, activeExtensions);
|
|
305
|
-
const question = argv.promptInteractive || argv.prompt ||
|
|
314
|
+
const question = argv.promptInteractive || argv.prompt || '';
|
|
306
315
|
// Determine approval mode with backward compatibility
|
|
307
316
|
let approvalMode;
|
|
308
317
|
if (argv.approvalMode) {
|
|
@@ -346,26 +355,21 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
346
355
|
throw err;
|
|
347
356
|
}
|
|
348
357
|
const policyEngineConfig = createPolicyEngineConfig(settings, approvalMode);
|
|
349
|
-
|
|
350
|
-
const
|
|
351
|
-
// Fix: If promptWords are provided, always use non-interactive mode
|
|
352
|
-
const hasPromptWords = argv.promptWords && argv.promptWords.length > 0;
|
|
358
|
+
// Interactive mode: explicit -i flag or (TTY + no args + no -p flag)
|
|
359
|
+
const hasQuery = !!argv.query;
|
|
353
360
|
const interactive = !!argv.promptInteractive ||
|
|
354
|
-
(process.stdin.isTTY && !
|
|
361
|
+
(process.stdin.isTTY && !hasQuery && !argv.prompt);
|
|
355
362
|
// In non-interactive mode, exclude tools that require a prompt.
|
|
356
363
|
const extraExcludes = [];
|
|
357
364
|
if (!interactive && !argv.experimentalAcp) {
|
|
358
|
-
const defaultExcludes = [ShellTool.Name, EditTool.Name, WriteFileTool.Name];
|
|
359
|
-
const autoEditExcludes = [ShellTool.Name];
|
|
360
|
-
const toolExclusionFilter = createToolExclusionFilter(allowedTools, allowedToolsSet);
|
|
361
365
|
switch (approvalMode) {
|
|
362
366
|
case ApprovalMode.DEFAULT:
|
|
363
367
|
// In default non-interactive mode, all tools that require approval are excluded.
|
|
364
|
-
extraExcludes.push(
|
|
368
|
+
extraExcludes.push(ShellTool.Name, EditTool.Name, WriteFileTool.Name);
|
|
365
369
|
break;
|
|
366
370
|
case ApprovalMode.AUTO_EDIT:
|
|
367
371
|
// In auto-edit non-interactive mode, only tools that still require a prompt are excluded.
|
|
368
|
-
extraExcludes.push(
|
|
372
|
+
extraExcludes.push(ShellTool.Name);
|
|
369
373
|
break;
|
|
370
374
|
case ApprovalMode.YOLO:
|
|
371
375
|
// No extra excludes for YOLO mode.
|
|
@@ -391,7 +395,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
391
395
|
if (argv.allowedMcpServerNames) {
|
|
392
396
|
mcpServers = allowedMcpServers(mcpServers, argv.allowedMcpServerNames, blockedMcpServers);
|
|
393
397
|
}
|
|
394
|
-
const useModelRouter = settings.experimental?.useModelRouter ??
|
|
398
|
+
const useModelRouter = settings.experimental?.useModelRouter ?? false;
|
|
395
399
|
const defaultModel = useModelRouter
|
|
396
400
|
? DEFAULT_GEMINI_MODEL_AUTO
|
|
397
401
|
: DEFAULT_GEMINI_MODEL;
|
|
@@ -414,7 +418,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
414
418
|
question,
|
|
415
419
|
fullContext: argv.allFiles || false,
|
|
416
420
|
coreTools: settings.tools?.core || undefined,
|
|
417
|
-
allowedTools: allowedTools
|
|
421
|
+
allowedTools: argv.allowedTools || settings.tools?.allowed || undefined,
|
|
418
422
|
policyEngineConfig,
|
|
419
423
|
excludeTools,
|
|
420
424
|
toolDiscoveryCommand: settings.tools?.discoveryCommand,
|
|
@@ -470,6 +474,7 @@ export async function loadCliConfig(settings, extensions, sessionId, argv, cwd =
|
|
|
470
474
|
},
|
|
471
475
|
useModelRouter,
|
|
472
476
|
enableMessageBusIntegration: settings.tools?.enableMessageBusIntegration ?? false,
|
|
477
|
+
enableSubagents: settings.experimental?.enableSubagents ?? false,
|
|
473
478
|
});
|
|
474
479
|
}
|
|
475
480
|
function allowedMcpServers(mcpServers, allowMCPServers, blockedMcpServers) {
|