|
Download docs/extensions/reference.md from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 12 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/extensions/reference.md
- Command line
-
hf download hf://SaylorTwift/gemini-cli/docs/extensions/reference.md
-
curl -L -o reference.md https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/extensions/reference.md
12 kB
| # Extension reference | |
| This guide covers the `gemini extensions` commands and the structure of the | |
| `gemini-extension.json` configuration file. | |
| ## Manage extensions | |
| Use the `gemini extensions` command group to manage your extensions from the | |
| terminal. | |
| Note that commands like `gemini extensions install` are not supported within the | |
| CLI's interactive mode. However, you can use the `/extensions list` command to | |
| view installed extensions. All management operations, including updates to slash | |
| commands, take effect only after you restart the CLI session. | |
| ### Install an extension | |
| Install an extension by providing its GitHub repository URL or a local file | |
| path. | |
| Gemini CLI creates a copy of the extension during installation. You must run | |
| `gemini extensions update` to pull changes from the source. To install from | |
| GitHub, you must have `git` installed on your machine. | |
| ```bash | |
| gemini extensions install <source> [--ref <ref>] [--auto-update] [--pre-release] [--consent] [--skip-settings] | |
| ``` | |
| - `<source>`: The GitHub URL or local path of the extension. | |
| - `--ref`: The git ref (branch, tag, or commit) to install. | |
| - `--auto-update`: Enable automatic updates for this extension. | |
| - `--pre-release`: Enable installation of pre-release versions. | |
| - `--consent`: Acknowledge security risks and skip the confirmation prompt. | |
| - `--skip-settings`: Skip the configuration on install process. | |
| ### Uninstall an extension | |
| To uninstall one or more extensions, use the `uninstall` command: | |
| ```bash | |
| gemini extensions uninstall <name...> | |
| ``` | |
| ### Disable an extension | |
| Extensions are enabled globally by default. You can disable an extension | |
| entirely or for a specific workspace. | |
| ```bash | |
| gemini extensions disable <name> [--scope <scope>] | |
| ``` | |
| - `<name>`: The name of the extension to disable. | |
| - `--scope`: The scope to disable the extension in (`user` or `workspace`). | |
| ### Enable an extension | |
| Re-enable a disabled extension using the `enable` command: | |
| ```bash | |
| gemini extensions enable <name> [--scope <scope>] | |
| ``` | |
| - `<name>`: The name of the extension to enable. | |
| - `--scope`: The scope to enable the extension in (`user` or `workspace`). | |
| ### Update an extension | |
| Update an extension to the version specified in its `gemini-extension.json` | |
| file. | |
| ```bash | |
| gemini extensions update <name> | |
| ``` | |
| To update all installed extensions at once: | |
| ```bash | |
| gemini extensions update --all | |
| ``` | |
| ### Create an extension from a template | |
| Create a new extension directory using a built-in template. | |
| ```bash | |
| gemini extensions new <path> [template] | |
| ``` | |
| - `<path>`: The directory to create. | |
| - `[template]`: The template to use (for example, `mcp-server`, `context`, | |
| `custom-commands`). | |
| ### Link a local extension | |
| Create a symbolic link between your development directory and Gemini CLI | |
| extensions directory. This lets you test changes immediately without | |
| reinstalling. | |
| ```bash | |
| gemini extensions link <path> | |
| ``` | |
| ## Extension format | |
| Gemini CLI loads extensions from `<home>/.gemini/extensions`. Each extension | |
| must have a `gemini-extension.json` file in its root directory. | |
| ### `gemini-extension.json` | |
| The manifest file defines the extension's behavior and configuration. | |
| ```json | |
| { | |
| "name": "my-extension", | |
| "version": "1.0.0", | |
| "description": "My awesome extension", | |
| "mcpServers": { | |
| "my-server": { | |
| "command": "node", | |
| "args": ["${extensionPath}/my-server.js"], | |
| "cwd": "${extensionPath}" | |
| } | |
| }, | |
| "contextFileName": "GEMINI.md", | |
| "excludeTools": ["run_shell_command"], | |
| "migratedTo": "https://github.com/new-owner/new-extension-repo", | |
| "plan": { | |
| "directory": ".gemini/plans" | |
| } | |
| } | |
| ``` | |
| - `name`: The name of the extension. This is used to uniquely identify the | |
| extension and for conflict resolution when extension commands have the same | |
| name as user or project commands. The name should be lowercase or numbers and | |
| use dashes instead of underscores or spaces. This is how users will refer to | |
| your extension in the CLI. Note that we expect this name to match the | |
| extension directory name. | |
| - `version`: The version of the extension. | |
| - `description`: A short description of the extension. This will be displayed on | |
| [geminicli.com/extensions](https://geminicli.com/extensions). | |
| - `migratedTo`: The URL of the new repository source for the extension. If this | |
| is set, the CLI will automatically check this new source for updates and | |
| migrate the extension's installation to the new source if an update is found. | |
| - `mcpServers`: A map of MCP servers to settings. The key is the name of the | |
| server, and the value is the server configuration. These servers will be | |
| loaded on startup just like MCP servers defined in a | |
| [`settings.json` file](../reference/configuration.md). If both an extension | |
| and a `settings.json` file define an MCP server with the same name, the server | |
| defined in the `settings.json` file takes precedence. | |
| - Note that all MCP server configuration options are supported except for | |
| `trust`. | |
| - For portability, you should use `${extensionPath}` to refer to files within | |
| your extension directory. | |
| - Separate your executable and its arguments using `command` and `args` | |
| instead of putting them both in `command`. | |
| - `contextFileName`: The name of the file that contains the context for the | |
| extension. This will be used to load the context from the extension directory. | |
| If this property is not used but a `GEMINI.md` file is present in your | |
| extension directory, then that file will be loaded. | |
| - `excludeTools`: An array of tool names to exclude from the model. You can also | |
| specify command-specific restrictions for tools that support it, like the | |
| `run_shell_command` tool. For example, | |
| `"excludeTools": ["run_shell_command(rm -rf)"]` will block the `rm -rf` | |
| command. Note that this differs from the MCP server `excludeTools` | |
| functionality, which can be listed in the MCP server config. | |
| - `plan`: Planning features configuration. | |
| - `directory`: The directory where planning artifacts are stored. This serves | |
| as a fallback if the user hasn't specified a plan directory in their | |
| settings. If not specified by either the extension or the user, the default | |
| is `~/.gemini/tmp/<project>/<session-id>/plans/`. | |
| When Gemini CLI starts, it loads all the extensions and merges their | |
| configurations. If there are any conflicts, the workspace configuration takes | |
| precedence. | |
| ### Extension settings | |
| Extensions can define settings that users provide during installation, such as | |
| API keys or URLs. These values are stored in a `.env` file within the extension | |
| directory. | |
| To define settings, add a `settings` array to your manifest: | |
| ```json | |
| { | |
| "name": "my-api-extension", | |
| "version": "1.0.0", | |
| "settings": [ | |
| { | |
| "name": "API Key", | |
| "description": "Your API key for the service.", | |
| "envVar": "MY_API_KEY", | |
| "sensitive": true | |
| } | |
| ] | |
| } | |
| ``` | |
| - `name`: The setting's display name. | |
| - `description`: A clear explanation of the setting. | |
| - `envVar`: The environment variable name where the value is stored. | |
| - `sensitive`: If `true`, the value is stored in the system keychain and | |
| obfuscated in the UI. | |
| To update an extension's settings: | |
| ```bash | |
| gemini extensions config <name> [setting] [--scope <scope>] | |
| ``` | |
| #### Environment variable sanitization | |
| For security reasons, sensitive environment variables are filtered out and not | |
| passed to extensions or MCP servers by default. | |
| Extensions **will not** inherit the user's full shell environment variables. | |
| They will only have access to: | |
| 1. Standard safe variables (e.g., `HOME`, `PATH`, `TMPDIR`). | |
| 2. Variables explicitly declared and requested in the `gemini-extension.json` | |
| manifest via the `settings` array (using the `envVar` property). | |
| If your extension requires specific environment variables (like an API key, | |
| custom host, or config path), you **must** declare them in the `settings` array | |
| so the CLI can allowlist them for use within the extension. | |
| ### Custom commands | |
| Provide [custom commands](../cli/custom-commands.md) by placing TOML files in a | |
| `commands/` subdirectory. Gemini CLI uses the directory structure to determine | |
| the command name. | |
| For an extension named `gcp`: | |
| - `commands/deploy.toml` becomes `/deploy` | |
| - `commands/gcs/sync.toml` becomes `/gcs:sync` (namespaced with a colon) | |
| ### Hooks | |
| Intercept and customize CLI behavior using [hooks](../hooks/index.md). Define | |
| hooks in a `hooks/hooks.json` file within your extension directory. Note that | |
| hooks are not defined in the `gemini-extension.json` manifest. | |
| ### Agent skills | |
| Bundle [agent skills](../cli/skills.md) to provide specialized workflows. Place | |
| skill definitions in a `skills/` directory. For example, | |
| `skills/security-audit/SKILL.md` exposes a `security-audit` skill. | |
| ### Sub-agents | |
| <!-- prettier-ignore --> | |
| > [!NOTE] | |
| > Sub-agents are a preview feature currently under active development. | |
| Provide [sub-agents](../core/subagents.md) that users can delegate tasks to. Add | |
| agent definition files (`.md`) to an `agents/` directory in your extension root. | |
| ### <a id="policy-engine"></a>Policy Engine | |
| Extensions can contribute policy rules and safety checkers to Gemini CLI | |
| [Policy Engine](../reference/policy-engine.md). These rules are defined in | |
| `.toml` files and take effect when the extension is activated. | |
| To add policies, create a `policies/` directory in your extension's root and | |
| place your `.toml` policy files inside it. Gemini CLI automatically loads all | |
| `.toml` files from this directory. | |
| Rules contributed by extensions run in their own tier (tier 2), alongside | |
| workspace-defined policies. This tier has higher priority than the default rules | |
| but lower priority than user or admin policies. | |
| <!-- prettier-ignore --> | |
| > [!WARNING] | |
| > For security, Gemini CLI ignores any `allow` decisions or `yolo` | |
| > mode configurations in extension policies. This ensures that an extension | |
| > cannot automatically approve tool calls or bypass security measures without | |
| > your confirmation. | |
| **Example `policies.toml`** | |
| ```toml | |
| [[rule]] | |
| mcpName = "my_server" | |
| toolName = "dangerous_tool" | |
| decision = "ask_user" | |
| priority = 100 | |
| [[safety_checker]] | |
| mcpName = "my_server" | |
| toolName = "write_data" | |
| priority = 200 | |
| [safety_checker.checker] | |
| type = "in-process" | |
| name = "allowed-path" | |
| required_context = ["environment"] | |
| ``` | |
| ### Themes | |
| Extensions can provide custom themes to personalize the CLI UI. Themes are | |
| defined in the `themes` array in `gemini-extension.json`. | |
| **Example** | |
| ```json | |
| { | |
| "name": "my-green-extension", | |
| "version": "1.0.0", | |
| "themes": [ | |
| { | |
| "name": "shades-of-green", | |
| "type": "custom", | |
| "background": { | |
| "primary": "#1a362a" | |
| }, | |
| "text": { | |
| "primary": "#a6e3a1", | |
| "secondary": "#6e8e7a", | |
| "link": "#89e689" | |
| }, | |
| "status": { | |
| "success": "#76c076", | |
| "warning": "#d9e689", | |
| "error": "#b34e4e" | |
| }, | |
| "border": { | |
| "default": "#4a6c5a" | |
| }, | |
| "ui": { | |
| "comment": "#6e8e7a" | |
| } | |
| } | |
| ] | |
| } | |
| ``` | |
| Custom themes provided by extensions can be selected using the `/theme` command | |
| or by setting the `ui.theme` property in your `settings.json` file. Note that | |
| when referring to a theme from an extension, the extension name is appended to | |
| the theme name in parentheses, for example, | |
| `shades-of-green (my-green-extension)`. | |
| ### Conflict resolution | |
| Extension commands have the lowest precedence. If an extension command name | |
| conflicts with a user or project command, the extension command is prefixed with | |
| the extension name (for example, `/gcp.deploy`) using a dot separator. | |
| ## Variables | |
| Gemini CLI supports variable substitution in `gemini-extension.json` and | |
| `hooks/hooks.json`. | |
| | Variable | Description | | |
| | :----------------- | :---------------------------------------------- | | |
| | `${extensionPath}` | The absolute path to the extension's directory. | | |
| | `${workspacePath}` | The absolute path to the current workspace. | | |
| | `${/}` | The platform-specific path separator. | | |