





























| string | 启动服务器时使用的工作目录。 | undefined |
|
mcpServers.<SERVER_NAME>.url |
string | 使用 Server-Sent Events(SSE)通信的 MCP 服务器 URL。 | undefined |
mcpServers.<SERVER_NAME>.httpUrl |
string | 使用可流式 HTTP 通信的 MCP 服务器 URL。 | undefined |
mcpServers.<SERVER_NAME>.headers |
object | 随请求发送到 url 或 httpUrl 的 HTTP 头映射。 |
undefined |
mcpServers.<SERVER_NAME>.timeout |
number | MCP 服务器请求的超时时间(毫秒)。 | undefined |
mcpServers.<SERVER_NAME>.trust |
boolean | 信任该服务器并绕过所有工具调用确认。 | undefined |
mcpServers.<SERVER_NAME>.description |
string | 服务器的简要描述,用于展示用途。 | undefined |
mcpServers.<SERVER_NAME>.includeTools |
string[] | 从该 MCP 服务器中包含的工具名称列表(白名单);未指定则启用全部工具。 | undefined |
mcpServers.<SERVER_NAME>.excludeTools |
string[] | 从该 MCP 服务器中排除的工具名称列表;优先级高于 includeTools。 |
undefined |
为 Gemini CLI 配置日志记录与指标采集。
| 属性 | 类型 | 说明 | 取值 / 备注 |
|---|---|---|---|
enabled |
boolean | 是否启用 telemetry。 | — |
target |
string | telemetry 的采集目标位置。 | local / gcp |
otlpEndpoint |
string | OTLP Exporter 的端点。 | — |
otlpProtocol |
string | OTLP Exporter 的协议。 | grpc / http |
logPrompts |
boolean | 是否在日志中包含用户 prompt 的内容。 | — |
outfile |
string | 当 target 为 local 时,telemetry 写入的文件路径。 |
— |
useCollector |
boolean | 是否使用外部 OTLP collector。 | — |
下面是一个具有嵌套结构的 settings.json 文件示例,该结构自v0.3.0 起提供:
{
"general": {
"vimMode": true,
"preferredEditor": "code",
"sessionRetention": {
"enabled": true,
"maxAge": "30d",
"maxCount": 100
}
},
"ui": {
"theme": "GitHub",
"hideBanner": true,
"hideTips": false,
"customWittyPhrases": [
"You forget a thousand things every day. Make sure this is one of ’em",
"Connecting to AGI"
]
},
"tools": {
"sandbox": "docker",
"discoveryCommand": "bin/get_tools",
"callCommand": "bin/call_tool",
"exclude": ["write_file"]
},
"mcpServers": {
"mainServer": {
"command": "bin/mcp_server.py"
},
"anotherServer": {
"command": "node",
"args": ["mcp_server.js", "--verbose"]
}
},
"telemetry": {
"enabled": true,
"target": "local",
"otlpEndpoint": "http://localhost:4317",
"logPrompts": true
},
"privacy": {
"usageStatisticsEnabled": true
},
"model": {
"name": "gemini-1.5-pro-latest",
"maxSessionTurns": 10,
"summarizeToolOutput": {
"run_shell_command": {
"tokenBudget": 100
}
}
},
"context": {
"fileName": ["CONTEXT.md", "GEMINI.md"],
"includeDirectories": ["path/to/dir1", "~/path/to/dir2", "../path/to/dir3"],
"loadFromIncludeDirectories": true,
"fileFiltering": {
"respectGitIgnore": false
}
},
"advanced": {
"excludedEnvVars": ["DEBUG", "DEBUG_MODE", "NODE_ENV"]
}
}
json
CLI 会保留你运行过的 shell 命令历史记录。为避免在不同项目之间发生冲突,该历史记录会存储在你用户主目录下的项目专用目录中。
位置: ~/.gemini/tmp/<project_hash>/shell_history
<project_hash> 是根据你项目的根路径生成的唯一标识符。shell_history 的文件中。环境变量是配置应用程序的常见方式,尤其适用于API key 等敏感信息,或用于可能因环境不同而变化的设置,CLI 会自动从 .env 文件加载环境变量,加载顺序为:
Step 1. 当前工作目录中的 .env 文件。
Step 2. 若未找到,则向上在父目录中搜索,直到找到.env 文件或到达项目根目录(由 .git 文件夹标识)或
主目录。
Step 3. 若仍未找到,则查找 ~/.env(位于用户主目录中)。
环境变量排除: 某些环境变量(如
DEBUG和DEBUG_MODE)会被自动排除,不从项目.env
文件中加载,以防干扰 gemini-cli 的行为。来自.gemini/.env文件的变量永远不会被排除。你可以使用settings.json文件中的advanced.excludedEnvVars设置来自定义此行为。
| 环境变量 | 说明 | 备注 / 示例 |
|---|---|---|
GEMINI_API_KEY |
你的 Gemini API key,用于访问 Gemini API。 | 在 ~/.bashrc / ~/.zshrc 或 .env 中设置 |
GEMINI_MODEL |
指定默认使用的 Gemini 模型,覆盖内置默认值。 | export GEMINI_MODEL="gemini-3-flash-preview" |
GOOGLE_API_KEY |
Google Cloud API key;express 模式下使用 Vertex AI 所必需。 | export GOOGLE_API_KEY="YOUR_GOOGLE_API_KEY" |
GOOGLE_CLOUD_PROJECT |
Google Cloud Project ID;使用 Code Assist 或 Vertex AI 所必需。 | export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" |
GOOGLE_APPLICATION_CREDENTIALS |
Google Application Credentials JSON 文件路径。 | export GOOGLE_APPLICATION_CREDENTIALS="/path/to/credentials.json" |
OTLP_GOOGLE_CLOUD_PROJECT |
Telemetry 使用的 Google Cloud Project ID。 | export OTLP_GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" |
GEMINI_TELEMETRY_ENABLED |
启用 telemetry(true / 1 启用,其余视为禁用)。 |
覆盖 telemetry.enabled |
GEMINI_TELEMETRY_TARGET |
设置 telemetry 目标位置。 | local / gcp,覆盖 telemetry.target |
GEMINI_TELEMETRY_OTLP_ENDPOINT |
设置 telemetry 的 OTLP 端点。 | 覆盖 telemetry.otlpEndpoint |
GEMINI_TELEMETRY_OTLP_PROTOCOL |
设置 telemetry 的 OTLP 协议。 | grpc / http,覆盖 telemetry.otlpProtocol |
GEMINI_TELEMETRY_LOG_PROMPTS |
是否记录用户 prompt 到 telemetry。 | 覆盖 telemetry.logPrompts |
GEMINI_TELEMETRY_OUTFILE |
当目标为 local 时写入 telemetry 的文件路径。 |
覆盖 telemetry.outfile |
GEMINI_TELEMETRY_USE_COLLECTOR |
是否使用外部 OTLP collector。 | 覆盖 telemetry.useCollector |
GOOGLE_CLOUD_LOCATION |
Google Cloud Project 的区域(非 express 模式下 Vertex AI 必需)。 | export GOOGLE_CLOUD_LOCATION="us-central1" |
GEMINI_SANDBOX |
settings.json 中 sandbox 的替代方案。 |
true / false / docker / podman / 自定义命令 |
GEMINI_SYSTEM_MD |
用 Markdown 文件内容替换内置 system prompt。 | true 使用 ./.gemini/system.md |
GEMINI_WRITE_SYSTEM_MD |
将当前内置 system prompt 写入文件。 | true 写入 ./.gemini/system.md |
SEATBELT_PROFILE |
macOS 专用:切换 sandbox-exec profile。 | permissive-open / strict / 自定义 |
DEBUG / DEBUG_MODE |
启用详细 debug 日志。 | 建议在 .gemini/.env 中设置 |
NO_COLOR |
禁用 CLI 中的所有彩色输出。 | 任意值 |
CLI_TITLE |
自定义 CLI 窗口标题。 | 字符串 |
CODE_ASSIST_ENDPOINT |
指定 Code Assist server 的端点。 | 用于开发与测试 |
为防止敏感信息意外泄露,Gemini CLI 在执行工具(例如shell 命令)时,会自动从环境变量中打码潜在的秘密信息。这种“尽力而为”的打码适用于从系统继承的变量或从 .env 文件加载的变量。
默认打码规则:
TOKEN、SECRET、PASSWORD、KEY、AUTH``CREDENTIAL、PRIVATE 或 CERT,则会被打码。CLIENT_ID、DB_URI、DATABASE_URL 和 CONNECTION_STRING 默认总会被打码。白名单(永不打码):
PATH、HOME、USER、SHELL、TERM、LANG)。GEMINI_CLI_ 开头的变量。你可以在 settings.json 文件中自定义该行为:
security.allowedEnvironmentVariables: 一个变量名列表,用于security.blockedEnvironmentVariables: 一个变量名列表,用于{
"security": {
"allowedEnvironmentVariables": ["MY_PUBLIC_KEY", "NOT_A_SECRET_TOKEN"],
"blockedEnvironmentVariables": ["INTERNAL_IP_ADDRESS"]
}
}
json
在运行 CLI 时直接传入的参数可以覆盖该会话中的其他配置。
--model <model_name> (-m <model_name>):
npm start -- --model gemini-3-pro-preview--prompt <your_prompt> (-p <your_prompt>):
--output-format json 标志以获得结构化输出。--prompt-interactive <your_prompt> (-i <your_prompt>):
gemini -i "explain this code"--output-format <format>:
text:(默认)标准的人类可读输出。json: 机器可读的 JSON 输出。stream-json: 以流式方式输出 JSON,实时发出事件。--output-format json 或 --output-format stream-json 标志。--sandbox (-s): 为本次会话启用 sandbox 模式。
--debug (-d): 为本次会话启用 debug 模式,提供更详细的输出。按 F12 打开debug 控制台以查看额外日志。
--help(或 -h): 显示命令行参数的帮助信息。
--yolo: 启用 YOLO 模式,该模式会自动批准所有工具调用。
--approval-mode <mode>:设置工具调用的批准模式。可用模式:
default: 每次工具调用都提示批准(默认行为)
auto_edit: 自动批准编辑工具(replace、write_file),其余仍提示
yolo: 自动批准所有工具调用(等同于 --yolo)
plan: 工具调用只读模式(需要启用实验性 planning)。
注意: 该模式目前仍在开发中,尚未完全
可用。
不能与 --yolo 同时使用。新统一方式请使用 --approval-mode=yolo 代替--yolo。
示例:gemini --approval-mode auto_edit
--allowed-tools <tool1,tool2,...>:
gemini --allowed-tools "ShellTool(git status)"--extensions <extension_name ...> (-e <extension_name ...>):
gemini -e none 可禁用所有扩展。gemini -e my-extension -e my-other-extension--list-extensions (-l): 列出所有可用扩展并退出。
--resume [session_id] (-r [session_id]):
gemini --resume 5 或 gemini --resume latest 或 gemini --resume a1b2c3d4-e5f6-7890-abcd-ef1234567890 或 gemini --resume--list-sessions:
gemini --list-sessions--delete-session <identifier>:
--list-sessions 查看可用会话、它们的索引与UUID。gemini --delete-session 3 或 gemini --delete-session a1b2c3d4-e5f6-7890-abcd-ef1234567890--include-directories <dir1,dir2,...>:
--include-directories /path/to/project1,/path/to/project2 或--include-directories /path/to/project1 --include-directories /path/to/project2--screen-reader: 启用屏幕阅读器模式,通过调整 TUI 以更好地兼容屏幕阅读器。
--version: 显示 CLI 的版本。
--experimental-acp: 以 ACP 模式启动 agent。
--allowed-mcp-server-names: 允许的 MCP server 名称。
--fake-responses: 指向包含伪造 model 响应的文件路径,用于测试。
--record-responses: 指向用于记录 model 响应的文件路径,用于测试。
Context files 虽然并不严格用于配置 CLI 的 _behavior_,但它们(默认使用 GEMINI.md,也可通过 context.fileName 设置配置)对于配置提供给 Gemini model 的 _instructional context_(也称为“memory”)至关重要。这个强大功能允许你提供项目专用说明、编码风格指南或任何相关背景信息,使 AI 的响应更贴合且更准确地满足你的需求,CLI 还包含 UI 元素,例如页脚中的指示器显示已加载的 context files 数量,以便让你了解当前激活的context。
用途: 这些 Markdown 文件包含你希望 Gemini model 在交互期间知晓的说明、指南或 context,系统被设计为以分层方式管理此 instructional context。
下面是一个概念性示例(例如 GEMINI.md),展示 TypeScript项目根目录中的 context file 可能包含的内容:
## Project: My Awesome TypeScript Library
### General Instructions:
- When generating new TypeScript code, please follow the existing coding style.
- Ensure all new functions and classes have JSDoc comments.
- Prefer functional programming paradigms where appropriate.
- All code should be compatible with TypeScript 5.0 and Node.js 20+.
### Coding Style:
- Use 2 spaces for indentation.
- Interface names should be prefixed with `I` (e.g., `IUserService`).
- Private class members should be prefixed with an underscore (`_`).
- Always use strict equality (`===` and `!==`).
### Specific Component: `src/api/client.ts`
- This file handles all outbound API requests.
- When adding new API call functions, ensure they include robust error handling
and logging.
- Use the existing `fetchWithRetry` utility for all GET requests.
### Regarding Dependencies:
- Avoid introducing new external dependencies unless absolutely necessary.
- If a new dependency is required, please state the reason.
markdown
这个示例展示了你如何提供通用的项目 context、特定的编码规范,甚至关于特定文件或组件的说明。你的 context files 越相关且精确,AI 就越能更好地协助你。强烈建议使用项目专用 context files 来建立约定与 context。
分层加载与优先级: CLI 通过从多个位置加载 context files(例如 GEMINI.md)来实现精巧的分层 memory 系统。该列表中越靠下(越具体)的文件内容通常会覆盖或补充越靠上(越通用)的文件内容。可使用 /memory show 命令检查具体的拼接顺序与最终 context。典型加载顺序为:
~/.gemini/<configured-context-filename>(例如~/.gemini/GEMINI.md)。.git 文件夹标识)或用户主目录。node_modules、.git 等常见settings.json 中的context.discoveryMaxDirs 设置进行配置。拼接与 UI 指示: 所有找到的 context files 的内容会被拼接(并带有分隔符以标明其来源与路径)并作为 system prompt 的一部分提供给 Gemini model。CLI 页脚会显示已加载 context files 的数量,让你能快速直观地了解当前激活的 instructional context。
导入内容: 你可以使用 @path/to/file.md 语法导入其他 Markdown 文件,从而模块化你的 context files。更多细节请参见
用于 memory 管理的命令:
/memory refresh 强制重新扫描并重新加载所有 context files(来自所有已配置位置)。这会更新 AI 的 instructional context。/memory show 显示当前加载的 combined instructional context,以便你验证层级与正在被 AI 使用的内容。通过理解并利用这些配置层与 context files 的分层特性,你可以有效管理 AI 的 memory,并将
Gemini CLI 的响应更好地定制为符合你的特定需求与项目。
Gemini CLI 可以在沙箱环境中执行潜在不安全的操作(例如 shell 命令和文件修改),以保护你的系统。
Sandboxing 默认禁用,但你可以通过以下几种方式启用:
--sandbox 或 -s 标志。GEMINI_SANDBOX 环境变量。--yolo 或 --approval-mode=yolo 时默认启用 sandbox。默认情况下,它使用预构建的 gemini-cli-sandbox Docker image。
对于项目专用的 sandboxing 需求,你可以在项目根目录创建自定义 Dockerfile,路径为.gemini/sandbox.Dockerfile。该 Dockerfile 可以基于基础 sandbox image:
FROM gemini-cli-sandbox
## Add your custom dependencies or configurations here
## For example:
## RUN apt-get update && apt-get install -y some-package
## COPY ./my-config /app/my-config
dockerfile
当存在 .gemini/sandbox.Dockerfile 时,你可以在运行 Gemini CLI 时使用 BUILD_SANDBOX环境变量来自动构建自定义sandbox image:
BUILD_SANDBOX=1 gemini -s
bash
为了帮助我们改进 Gemini CLI,我们会收集匿名化的 usage statistics。该数据帮助我们了解 CLI 的使用方式、识别常见问题,并确定新功能的优先级。
我们收集的内容:
我们不收集的内容:
如何选择退出:
你可以随时通过将 settings.json 文件中 privacy 类别下的usageStatisticsEnabled 属性设置为 false 来选择退出 usage statistics 收集:
{
"privacy": {
"usageStatisticsEnabled": false
}
}
json
到这里,Gemini CLI 的整体配置体系就完整串起来了,理解它的关键,并不是记住所有配置项,而是掌握**“在什么场景下,用哪种方式配置”**,读者们可以按下面这个思路来使用 Gemini CLI:
一、长期稳定的偏好,用 settings.json
如果某个配置 每天都会用、希望一直生效,那就放进 settings.json:
model.name)个人使用: 放在 ~/.gemini/settings.json
项目使用 / 团队协作: 放在项目根目录 .gemini/settings.json,让所有人 clone 后即生效
二、敏感或环境相关的值,用环境变量
凡是 API Key、Credential、不同机器不一样的配置,都不要写死在配置文件中:
GEMINI_API_KEYGOOGLE_APPLICATION_CREDENTIALS推荐做法是:
.env 或 shell 配置文件.gemini/.env这样既安全,又不会污染仓库。
三、只想临时改一次,用命令行参数
只是这一次想换模型、开 debug、跑脚本,不需要动任何配置文件:
--model--prompt--output-format json命令行参数始终拥有最高优先级,适合测试、排错和自动化脚本。
四、真正提升效果的关键 Context Files(GEMINI.md)
如果希望 Gemini 更懂你的项目,而不仅仅是“能回答问题”,那么一定要使用 GEMINI.md 或自定义 context files:
这部分内容会作为 system prompt 注入模型,是影响回答质量最直接、性价比最高的配置手段。
五、一句话使用原则
理解并善用这套分层配置机制,就可以把 Gemini CLI 从“能用”,调教到“顺手、可控、可复用”。希望能帮助到大家,感谢阅读,本文完!

本文是进阶篇”,重点整理 Gemini CLI 中更偏工程/企业落地的能力:
一句话解释: 当你允许 Gemini CLI 调用会“改文件”的工具(比如写文件、替换内容)时,它会先自动做一次项目快照,确保你随时能恢复到“改之前”的状态。
这让你可以更大胆地让 AI 做重构/批量修改,因为你知道——随时可撤销。
当你批准一个会修改文件系统的工具(例如 write_file 或 replace)时,CLI 会自动创建一个“检查点”。检查点包含:
Git 快照(影子仓库提交)
~/.gemini/history/<project_hash>.git 不会被动)对话历史 :与 agent 的整个对话会被保存(方便恢复上下文)
工具调用信息 :即将执行的工具调用细节也会被记录(恢复后可重新执行/修改/忽略)
所有检查点数据都会存储在本机:
~/.gemini/history/<project_hash>~/.gemini/tmp/<project_hash>/checkpoints这也意味着它适合企业环境:不会把你的项目快照上传到远程仓库。
注意:
--checkpointing这个命令行标志已在 0.11.0 移除,现在只能通过settings.json开启。
在你的 settings.json 里添加:
{
"general": {
"checkpointing": {
"enabled": true
}
}
}
json
启用后,检查点会自动创建。管理它们用 /restore。
1)列出当前项目所有检查点:
/restore
text
CLI 会列出检查点文件,一般命名类似:
2025-06-22T10-00-00_000Z-my-file.txt-write_file含义通常是:时间戳 + 文件名 + 工具名
2)恢复到某个检查点:
/restore <checkpoint_file>
text
例子:
/restore 2025-06-22T10-00-00_000Z-my-file.txt-write_file
text
恢复后会发生三件事:
企业里最常见的痛点是:
Gemini CLI 提供了 系统级配置 来解决这些问题。
企业管理中最强大的工具是全局系统设置文件:
system-defaults.json:系统默认基线(最低优先级)settings.json:系统覆盖项(最高优先级,最终裁决)CLI 会从 4 个文件合并配置(单值设置优先级如下):
system-defaults.json)~/.gemini/settings.json)<project>/.gemini/settings.json)settings.json)最高对数组/对象类型(如
includeDirectories、mcpServers),是“合并”而不是直接覆盖。
系统默认值(system-defaults.json):
{
"ui": {
"theme": "default-corporate-theme"
},
"context": {
"includeDirectories": ["/etc/gemini-cli/common-context"]
}
}
json
用户设置(~/.gemini/settings.json):
{
"ui": {
"theme": "user-preferred-dark-theme"
},
"mcpServers": {
"corp-server": {
"command": "/usr/local/bin/corp-server-dev"
},
"user-tool": {
"command": "npm start --prefix ~/tools/my-tool"
}
},
"context": {
"includeDirectories": ["~/gemini-context"]
}
}
json
工作区设置(/.gemini/settings.json):
{
"ui": {
"theme": "project-specific-light-theme"
},
"mcpServers": {
"project-tool": {
"command": "npm start"
}
},
"context": {
"includeDirectories": ["./project-context"]
}
}
json
系统覆盖项(/etc/…/settings.json):
{
"ui": {
"theme": "system-enforced-theme"
},
"mcpServers": {
"corp-server": {
"command": "/usr/local/bin/corp-server-prod"
}
},
"context": {
"includeDirectories": ["/etc/gemini-cli/global-context"]
}
}
json
最终合并结果(最终真正生效的配置):
{
"ui": {
"theme": "system-enforced-theme"
},
"mcpServers": {
"corp-server": {
"command": "/usr/local/bin/corp-server-prod"
},
"user-tool": {
"command": "npm start --prefix ~/tools/my-tool"
},
"project-tool": {
"command": "npm start"
}
},
"context": {
"includeDirectories": [
"/etc/gemini-cli/common-context",
"~/gemini-context",
"./project-context",
"/etc/gemini-cli/global-context"
]
}
}
json
结论:
theme:系统覆盖项最高优先级,强制生效mcpServers:对象合并,同名 corp-server 以系统覆盖项为准includeDirectories:数组拼接(系统默认 → 用户 → 工作区 → 系统覆盖)/etc/gemini-cli/settings.jsonC:\ProgramData\gemini-cli\settings.json/Library/Application Support/GeminiCli/settings.jsonGEMINI_CLI_SYSTEM_SETTINGS_PATH问题:用户可以自己 export GEMINI_CLI_SYSTEM_SETTINGS_PATH=... 指向别的配置,从而绕开公司策略。
解决:用一个 wrapper 脚本把环境变量写死。
把下面脚本保存为 /usr/local/bin/gemini(并确保它在 PATH 中优先于真实 gemini):
#!/bin/bash
## Enforce the path to the corporate system settings file.
export GEMINI_CLI_SYSTEM_SETTINGS_PATH="/etc/gemini-cli/settings.json"
## Find the original gemini executable.
REAL_GEMINI_PATH=$(type -aP gemini | grep -v "^$(type -P gemini)$" | head -n 1)
if [ -z "$REAL_GEMINI_PATH" ]; then
echo "Error: The original 'gemini' executable was not found." >&2
exit 1
fi
## Pass all arguments to the real Gemini CLI executable.
exec "$REAL_GEMINI_PATH" "$@"
bash
企业安全治理的核心目标:最小权限原则(Least Privilege)。
只允许安全的只读工具(示例:读文件 + 列目录):
{
"tools": {
"core": ["ReadFileTool", "GlobTool", "ShellTool(ls)"]
}
}
json
例如阻止删除命令:
{
"tools": {
"exclude": ["ShellTool(rm -rf)"]
}
}
json
风险:黑名单是字符串匹配思路,聪明用户可能绕过。生产环境建议优先使用白名单。
目的:防止模型在没有明确批准的情况下执行工具。
{
"security": {
"disableYoloMode": true
}
}
json
如果你们用 MCP server(Model-Context Protocol)接入内部工具,就一定要理解:
mcpServers 会合并推荐 includeTools(只开放必要能力):
{
"mcp": {
"allowed": ["third-party-analyzer"]
},
"mcpServers": {
"third-party-analyzer": {
"command": "/usr/local/bin/start-3p-analyzer.sh",
"includeTools": ["code-search", "get-ticket-details"]
}
}
}
json
system settings.json 示例(强治理):
{
"mcp": {
"allowed": ["corp-data-api", "source-code-analyzer"]
},
"mcpServers": {
"corp-data-api": {
"command": "/usr/local/bin/start-corp-api.sh",
"timeout": 5000
},
"source-code-analyzer": {
"command": "/usr/local/bin/start-analyzer.sh"
}
}
}
json
效果:
mcp.allowed → 直接被阻止{
"mcpServers": {
"corp-data-api": {
"command": "/usr/local/bin/start-corp-api.sh"
}
}
}
json
风险:用户可以在自己 settings 里新增任意 server,最终会合并进可用工具列表。
沙箱的定位:在 AI 工具执行与宿主机之间加一道隔离层,避免误操作造成系统损坏。
沙箱方式有如下两种:
sandbox-exec,轻量安装与验证方式如下:
npm install -g @google/gemini-cli
gemini --version
bash
快速开启沙箱(3 种方式)
方式 1:命令行 flag
gemini -s -p "analyze the code structure"
bash
方式 2:环境变量
export GEMINI_SANDBOX=true
gemini -p "run the test suite"
bash
方式 3:settings.json(长期配置)
{
"tools": {
"sandbox": "docker"
}
}
json
启用优先级(从高到低):
-s/--sandboxGEMINI_SANDBOX=true|docker|podman|sandbox-exec{"tools":{"sandbox":true}}(或指定 docker/podman)macOS Seatbelt Profiles(常用):
通过 SEATBELT_PROFILE 环境变量设置:
permissive-open(默认):限制写入外部目录,允许网络permissive-closed:限制写入外部目录,不允许网络restrictive-open:更严格,允许网络restrictive-closed:最严格自定义容器沙箱参数(SANDBOX_FLAGS)
例如 Podman 禁用 SELinux label:
export SANDBOX_FLAGS="--security-opt label=disable"
bash
多个参数:
export SANDBOX_FLAGS="--flag1 --flag2=value"
bash
调试沙箱(DEBUG):
DEBUG=1 gemini -s -p "debug command"
bash
注意:项目
.env的DEBUG=true不会影响 gemini-cli,因为会被自动排除,需要调试请用.gemini/.env
为什么需要可观测性?
所有遥测行为都由
.gemini/settings.json控制,也可以用环境变量覆盖。
常见配置示例:
{
"telemetry": {
"enabled": true,
"target": "gcp",
"logPrompts": false
}
}
json
企业建议:
enabled: true(开启)logPrompts: false(不要采集 prompt 文本,避免敏感信息泄露)target: gcp 或 local 看你们的后端1)启用遥测:
{
"telemetry": {
"enabled": true,
"target": "gcp"
}
}
json
2)运行 CLI 并产生数据:
正常使用 gemini 即可。
3)查看(Console):
{
"telemetry": {
"enabled": true,
"target": "local",
"otlpEndpoint": "",
"outfile": ".gemini/telemetry.log"
}
}
json
{
"tools": {
"sandbox": "docker",
"core": [
"ReadFileTool",
"GlobTool",
"ShellTool(ls)",
"ShellTool(cat)",
"ShellTool(grep)"
]
},
"mcp": {
"allowed": ["corp-tools"]
},
"mcpServers": {
"corp-tools": {
"command": "/opt/gemini-tools/start.sh",
"timeout": 5000
}
},
"telemetry": {
"enabled": true,
"target": "gcp",
"otlpEndpoint": "https://telemetry-prod.example.com:4317",
"logPrompts": false
},
"advanced": {
"bugCommand": {
"urlTemplate": "https://servicedesk.example.com/new-ticket?title={title}&details={info}"
}
},
"privacy": {
"usageStatisticsEnabled": false
}
}
json
到这里,Gemini CLI 的企业级与工程化能力就基本梳理完了。可以看到,Gemini CLI 的设计目标并不只是“提升个人编码效率”,而是从一开始就围绕 可控性、安全性与可运维性 来构建,这也是它能进入真实工程与企业环境的关键。
回顾一下本文涉及的几个关键能力:
Checkpointing:让 AI 的“写文件 / 重构 / 批量修改”变成一件可回滚、可恢复、可审计的事情 → 这是 AI 能真正进入生产仓库的前提
集中式配置与优先级合并:系统 / 用户 / 工作区 / 覆盖项的多层合并 → 让“统一策略 + 灵活使用”不再是二选一
工具治理 + MCP 安全模型:白名单优先、禁用 YOLO、MCP allowed + includeTools → 把 AI 的能力牢牢限制在“你允许的边界内”
Sandbox(沙箱执行):Docker / Podman / macOS Seatbelt → 即使 AI 出错,也被关在笼子里
OpenTelemetry 可观测性:日志、指标、Trace、成本、审计 → 让 AI 使用情况像任何一个后端服务一样“看得见、管得住”

如果要真正把 Gemini CLI 用到中大型项目或团队协作场景中时,一个绕不开的问题也逐渐显现出来:
如何让 AI 在“知道得足够多”的同时,又不过度消耗上下文、避免被无关信息干扰?
传统的做法,往往是通过 PROMPT.md、GEMINI.md 等全局上下文文件,把所有背景知识一股脑塞给模型,随着项目演进,这类文件不可避免地变得臃肿、难维护,也越来越“吃 Token”。为了解决这一痛点,可以使用 —— Agent Skills。
本文将围绕 Agent Skills 的设计理念、启用方式、目录规范以及一个完整的实战案例,带大家理解它是如何通过 “按需加载上下文”的方式,让 AI 真正具备 模块化、可复用、可治理的专家能。
在传统的 AI 辅助开发中,我们通常会在项目根目录下放置一个类似于 PROMPT.md 或 GEMINI.md 的全局上下文文件。但这种做法有一个痛点:随着项目变大,全局背景信息会越来越多,不仅消耗大量的 Token,还可能让 AI 的注意力分散。
Agent Skills 就是为了解决这个问题而生的,它是 基于“Agent Skills 开放标准”构建的,简单来说,它将 特定领域的知识、操作流程和相关资源打包成一个独立的文件夹。
它的核心逻辑是“按需加载” (On-demand expertise): AI 平时并不知道这些详细指令,只有当你提出相关需求时,Gemini 才会自动“激活”对应的技能,将相关上下文拉取到当前会话中。
四大核心优势:
注意: 该功能目前处于实验阶段,需要开启
experimental.skills才能使用。你可以在/settings交互界面中搜索 “Skills” 进行开启。
Gemini CLI 会从三个主要位置自动发现技能(优先级依次降低):
.gemini/skills/):特定于当前项目的技能,建议提交到 Git 仓库与团队共享。~/.gemini/skills/):你的个人专属技能,在所有项目中均可使用。在终端中,可以使用 gemini skills 命令行工具来管理:
## 列出所有已发现的技能
gemini skills list
## 从 Git 仓库安装一个公开的技能包
gemini skills install https://github.com/user/repo.git
## 安装到特定项目的 Workspace 作用域
gemini skills install /path/to/skill --scope workspace
## 启用/禁用特定技能
gemini skills enable my-expertise
bash
如果正处于 Gemini 的交互式会话中,也可以使用斜杠命令:
/skills list:查看技能状态/skills disable <name> / /skills enable <name>:管理技能开关创建一个 Skill 非常简单,它本质上就是一个包含
SKILL.md文件的目录。
建议遵循以下官方推荐的约定(虽然只有 SKILL.md 是必选的):
my-skill/
├── SKILL.md # (必选) 元数据和核心指令 Prompt
├── scripts/ # (可选) 可供 AI 运行的 bash/python/node 脚本
├── references/ # (可选) 静态文档、Schema 或示例数据
└── assets/ # (可选) 代码模板等二进制资源
text
当技能被激活时,AI 可以看到整个文件夹的目录树,并能读取里面的脚本和资源!
这里以 代码审查专家 (Code Reviewer) 案例 讲解。
SKILL.md由两部分组成:顶部的 YAML 元数据,和底部的 Markdown 指令。
最重要的一点:description 字段是 AI 决定是否激活该技能的唯一依据,必须写得精准!
我们在 ~/.gemini/skills/code-reviewer/SKILL.md 中创建以下内容:
---
name: code-reviewer
description: 专门审查代码风格、安全性和性能。当用户要求“反馈”、“Review”、“审查”或“检查代码”时使用此技能。
---
## Code Reviewer (代码审查专家)
你是一名资深的技术专家。当用户要求审查代码时,请严格遵守以下工作流:
1. **分析**:审查暂存的 Git 变更或提供的特定文件。确保变更范围合理。
2. **风格**:确保代码遵循本项目的规范(参考项目根目录的编码指南)。
3. **安全性**:重点检查 SQL 注入、XSS、敏感信息硬编码等安全隐患。
4. **测试覆盖**:验证新逻辑是否包含对应的单元测试。
**输出格式**:请以简洁的 Markdown 列表形式,分别列出“亮点 (Strengths)”和“改进建议 (Opportunities)”。
markdown
下次当你对 Gemini CLI 说:“帮我 Review 一下刚才写的代码” 时,Gemini 就会识别到触发词,自动激活这个技能,并按照你设定的 4 步流程进行专业的代码审查。
不用担心 AI 乱用你的本地文件。Agent Skills 的运行机制在安全方面设计得很周到:
SKILL.md 的内容才会被注入历史记录,对应的文件夹权限才会被开放给 AI。想要用好 Agent Skills,建议遵循以下几点:
① Description(描述)是重中之重:AI 激活技能的逻辑类似于函数的语义搜索,你的 description 应该包含具体的触发词。例如,不要写“擅长写代码”,而是写“当需要生成 React 组件或编写前端测试用例时使用”。
② 区分作用域 (Scope):
~/.gemini/skills/),比如“Git Commit Message 生成器”、“个人周报总结助手”。.gemini/skills/),比如“团队特有 CI/CD 修复指南”、“微服务部署脚本助手”,并将其提交到 Git。③ “Don’t Just Prompt, Automate” (结合脚本):
既然支持文件夹,就不要只在 SKILL.md 里写文字,如果技能是关于“日志分析”,不如在 scripts/ 下放一个 python 脚本专门抓取日志,并在 SKILL.md 里告诉 AI:“遇到错误时,先运行 scripts/fetch_logs.py 获取最新日志”。
从本质上看,Agent Skills 并不是“又一种 Prompt 写法”,而是 Gemini CLI 在 Agent 架构层面迈出的关键一步:
它把“提示工程”从一次性的文本输入,升级为可版本化、可组合、可审计的能力模块。
通过 Agent Skills,你可以:
Agent Skills 几乎是一个绕不开、也非常值得尽早投入的能力。如果你觉得本文对你有帮助,欢迎点赞、收藏或关注,谢谢大家的阅读,本文完!

经过前面几篇文章的铺垫,相信大家已经能够顺利使用 Gemini CLI 完成日常开发任务,但在实际工程中,真正拉开效率差距的,并不是“会不会用命令”,而是是否理解 Gemini CLI 背后那套工具机制。
Gemini CLI 并不是一个简单的对话式终端,而是通过一组高度模块化的 Tools,让大模型能够直接:
本文将聚焦 Gemini CLI 的核心工具体系,结合官方文档与真实案例,逐一拆解每类工具的设计目的、使用方式以及工程实践中的最佳用法。
这是与日常开发结合最紧密的工具集,赋予了 AI 操作本地代码库的能力。
list_directory (列出目录)
用于查看项目结构。AI 会自动读取项目中的 .gitignore 文件,智能过滤掉 node_modules 等无关文件,从而减少 Token 消耗并保持上下文简洁。
read_file (读取文件)
这是 AI 理解代码的核心途径。除了纯文本文件,它还支持读取图片、音频甚至 PDF。对于超大文件,该工具支持智能分页读取,防止撑爆模型的上下文窗口。
write_file (写入文件)
直接在本地创建或覆盖文件。如果路径中包含不存在的文件夹,它会自动创建完整的目录树。出于安全考虑,此操作默认需要用户在终端按回车确认。
search_file_content (内容搜索)
在代码库中搜索特定文本。其底层优先调用 git grep 命令,这使得它能够实现毫秒级的跨文件搜索,比传统的遍历快得多。
replace (智能替换)
极其强大的代码修改工具。与传统的正则匹配不同,它通过“上下文匹配”来修改文件。即使目标文件在你和 AI 对话期间发生了轻微的偏移(如加了换行),它的自我纠错机制也能精准定位修改位置,大大提高了安全性。
让 AI 替你执行 Git 操作、运行构建脚本,甚至启动开发服务器。
run_shell_command (运行命令)
AI 可以通过此工具执行任意系统命令,并捕获标准输出 (Stdout)、错误输出 (Stderr) 和退出码,支持在命令末尾添加 & 符号以启动后台进程。
交互式 TUI 支持
如果开启了交互模式,AI 甚至可以运行 vim、htop 或 git rebase -i 等基于文本用户界面(TUI)的复杂程序。
安全配置建议 (settings.json):强烈建议在配置文件中使用白名单模式,严防 AI 误操作
{
"tools": {
"shell": {
"enableInteractiveShell": true,
"core": ["run_shell_command(git)", "run_shell_command(npm)", "run_shell_command(pnpm)"],
"exclude": ["run_shell_command(rm)"]
}
}
}
json
摆脱本地环境限制,让 AI 获取实时资讯。
web_fetch (网页抓取)
单次请求最多可并发抓取 20 个 URL。如果目标网站屏蔽了 Gemini 的官方服务器 API,CLI 会自动降级,使用你的本地网络环境进行抓取,确保成功率。
google_web_search (谷歌搜索)
官方文档链接:Web Search Tool
内置了 Google Search API。返回的结果不仅包含摘要信息,还会提供可验证的来源链接(Citations),确保信息的准确性。
避免每次对话都要重复介绍项目背景和代码规范。
save_memory (保存记忆)
该工具会将你的偏好信息永久写入 ~/.gemini/GEMINI.md 文件中。每次启动 CLI 时,系统会自动将该文件内容作为 System Prompt 的一部分加载。
最佳实践:建议仅用于存储核心元数据,如项目规范(“总是使用 TypeScript”)、代码风格偏好等,不建议存储大段的对话历史。
面对长链条的复杂需求,AI 的思路容易发散,Todos 工具帮助 AI 进行“自我规划”。
write_todos (编写待办)
当接到复杂指令(如“初始化一个 React 项目”)时,AI 会先生成任务列表,每个任务包含 pending、in_progress 或 completed 状态。在执行过程中,你可以随时按 Ctrl+T 快捷键,弹出工作进度面板查看 AI 当前进展。
MCP (Model Context Protocol) 是一种开放标准,通过它,Gemini CLI 的能力可以被无限扩展。
可以通过配置 MCP 服务器,让 Gemini CLI 连接到任何外部系统,例如公司内部的 Jira、本地的 MySQL 数据库,或者是 AWS 云资源。在终端输入 /mcp 即可进入交互式管理界面。
接下来看看在真实场景中,Gemini CLI 是如何工作的。
案例一:自动化重构老旧代码 (结合 File System)
场景:接手老 React 项目,需将所有废弃的
componentWillMount重构为useEffect。
glob 搜索 → read_file 阅读上下文 → replace 生成差异 Diff → 等待按回车确认→ 瞬间修改完毕。案例二:一键排查并修复 CI/CD 报错 (结合 Shell)
场景:拉取新代码后,
npm run test终端爆红。
run_shell_command 运行测试 → 分析 Stderr 发现 lodash 版本过低 → run_shell_command("npm install lodash@latest") → 再次运行测试 → 全绿通过。案例三:解决冷门框架的疑难杂症 (结合 Web Search)
用户 Prompt:“我在用 Fresh 框架时遇到 ‘Dynamic imports not allowed’ 报错,搜一下 GitHub Issues 给解决方案。”
AI 执行流:google_web_search 搜索 GitHub → web_fetch 抓取前三个 Issue 详情 → 直接告诉你:去 deno.json 里加一行配置项即可。
案例四:新员工的自动入职向导 (结合 Memory)
git status,分析 Diff,生成 feat: [JIRA-123] 增加用户登录接口,无需重复提示规范!案例五:全栈项目从 0 到 1 (结合 Todos)
write_todos,生成包含建目录、装依赖、写代码的 8 步清单,像流水线一样推进,永不“断片”。案例六:化身临时 DBA (结合 MCP)
get_table_schema) → 自动写 SQL (run_sql) 以 Markdown 表格形式返回数据。本文从工具视角系统梳理了 Gemini CLI 的能力体系,重点解析了文件系统、Shell、网络搜索、记忆、Todos 以及 MCP 等核心工具的设计与使用方式。
这些工具共同构成了 Gemini CLI 的执行基础,使大模型能够在真实开发环境中完成“读代码、跑命令、查资料、记规范、推进任务”等工程行为 ,只有理解并合理组合这些工具,才能在实际项目中稳定、高效地发挥 Gemini CLI 的价值。感谢阅读,希望能帮助到大家,本文完!

在 AI 辅助开发的浪潮中,Gemini CLI 提供了一种将大模型能力无缝集成到终端的方法。然而,真正的生产力提升往往来自于“量身定制”。如何在 AI 开始写代码前,强行灌输你的项目架构图?如何在 AI 试图删除敏感文件时,紧急制动?
本文将带你深入探索 Gemini CLI 的核心定制机制——Hooks(钩子)。通过本文,你将掌握其底层 I/O 机制、全生命周期事件流。
Gemini CLI 的运行机制是一个经典的智能体循环 (Agentic Loop):它接收输入,调用模型,解析意图,执行工具,再将结果反馈给模型。Hooks 是这个循环中的“拦截器”,它们在不修改 CLI 源码的情况下,通过标准输入输出(stdin/stdout)进行进程间通信(IPC)。
要注册一个 Hook,你需要在项目根目录下的 .gemini/hooks/<hook-name>/ 文件夹中创建两个文件:
index.js 或 main.py)hook.json (配置清单):这决定了你的脚本在什么时候触发。示例 hook.json:
{
"name": "project-context-injector",
"description": "在 AI 思考前注入项目架构说明",
"events": ["BeforeAgent"],
"command": "node index.js",
"enabled": true
}
json
console.log (非JSON)、调试信息、错误警告,必须且只能输出到 stderr。Gemini CLI 会捕获这些信息并在调试面板中展示。注意:如果在 Python 中写了
print("Starting hook..."),或者在 Node 中写了console.log("Fetching data"),会导致 CLI 接收到的 JSON 损坏,触发解析错误。
Gemini CLI 提供了极其细粒度的控制点,以下是智能体循环中触发 Hook 的顺序:
| 事件名称 (Event) | 触发时机 | 典型应用场景 |
|---|---|---|
BeforeAgent |
用户输入刚进来,AI 开始思考前。 | 上下文注入:附加代码规范、Git diff 历史。 |
BeforeModel |
CLI 即将向大模型发送网络请求前。 | 提示词改写:动态翻译、自动添加 Few-shot 示例。 |
AfterModel |
大模型返回原始文本响应后。 | 内容审核:过滤违禁词、结构化解析输出。 |
BeforeTool |
CLI 解析出需要调用工具(如执行 bash、读写文件)时。 | 安全沙箱:拦截危险命令(如 rm -rf),防止密钥泄露。 |
AfterTool |
工具执行完毕,结果即将发回给模型前。 | 结果脱敏:将执行结果中的敏感 IP、密码替换为 [REDACTED]。 |
AfterAgent |
整个交互轮次结束,最终回复呈现给用户后。 | 异步操作:记录日志到数据库、触发 Webhook 通知。 |
如果你的 Hook 需要查询大型数据库,每次都查会拖慢 AI 速度,我们需要实现缓存机制。
目录:.gemini/hooks/cache-demo/index.js
事件:BeforeAgent
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// 从 stdin 读取 CLI 传入的当前状态
const input = JSON.parse(fs.readFileSync(0, 'utf-8'));
// 缓存文件路径
const CACHE_FILE = path.join(process.env.GEMINI_PROJECT_DIR, '.gemini/hook-cache.json');
const CACHE_TTL = 3600 * 1000; // 缓存 1 小时
async function getProjectContext() {
// 检查缓存
if (fs.existsSync(CACHE_FILE)) {
const cache = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf-8'));
if (Date.now() - cache.timestamp < CACHE_TTL) {
console.error("[Hook] 命中缓存,极速返回!"); // 输出到 stderr
return cache.data;
}
}
console.error("[Hook] 缓存失效,正在请求远程 API...");
// 模拟耗时网络请求...
const data = "项目规范:React 18, TailwindCSS, 严禁使用 class 组件。";
// 写入缓存
fs.writeFileSync(CACHE_FILE, JSON.stringify({ timestamp: Date.now(), data }));
return data;
}
(async () => {
const context = await getProjectContext();
// 最终的 JSON 输出到 stdout
console.log(JSON.stringify({
hookSpecificOutput: {
hookEventName: 'BeforeAgent',
additionalContext: `\n### 实时项目上下文\n${context}`
}
}));
})();
javascript
Python 在数据处理和安全检查上非常方便。我们写一个拦截 sudo 或 rm 命令的安全 Hook。
目录:.gemini/hooks/security-check/main.py
事件:BeforeTool
#!/usr/bin/env python3
import sys
import json
def main():
# 1. 从标准输入读取上下文
input_data = json.load(sys.stdin)
# 2. 获取当前要执行的工具和内容
tool_name = input_data.get("tool_name")
tool_input = input_data.get("tool_input", {}).get("content", "")
# 3. 安全检测逻辑
dangerous_keywords = ["rm -rf", "sudo", "chown", "chmod 777"]
if tool_name == "shell":
for kw in dangerous_keywords:
if kw in tool_input:
# 打印到 stderr 作为调试记录
print(f"[安全警告] 拦截到危险命令: {kw}", file=sys.stderr)
# 4. 输出拦截指令到 stdout
result = {
"decision": "deny", # 关键:拒绝执行
"reason": f"检测到危险的 Shell 命令: {kw}",
"systemMessage": "⚠️ 安全策略阻止了本次操作,请手动执行或修改命令。"
}
print(json.dumps(result))
sys.exit(2) # 退出码 2 表示系统阻止
# 5. 安全通过
print(json.dumps({"decision": "allow"}))
sys.exit(0)
if __name__ == "__main__":
main()
python
为了精确控制,你需要了解 CLI 会传入哪些数据,以及你可以返回哪些字段。
无论哪个事件,都会收到这个核心对象:
{
"timestamp": "2024-05-20T10:00:00Z",
"session_id": "ses_abc123",
"hook_event_name": "BeforeAgent",
"messages": [ /* 完整的历史对话记录数组 */ ],
"working_dir": "/Users/dev/my-project",
"tool_name": "shell", // 仅在 Tool 相关事件中存在
"tool_input": { ... } // 仅在 Tool 相关事件中存在
}
json
你的输出直接决定了 CLI 的下一步行为:
additionalContext (String): 在 prompt 后追加的不可见(对用户)上下文。prompt (String): 直接覆盖用户的原始 prompt。decision (“allow” | “deny”): 在 Tool 事件中,决定是否执行工具。continue (Boolean): 设为 false 可在此轮次中强制停止整个循环。本文围绕 Gemini CLI 的 Hooks 机制 展开,系统性地介绍了其在智能体循环中的定位与工作原理,重点解析了 Hook 的基础配置方式、基于 stdin/stdout 的进程间通信规则,以及 Hooks 在 Agent 全生命周期中可介入的关键事件节点。感谢阅读,希望能帮助到大家,本文完!

通过 Gemini CLI 扩展,可以将提示词(Prompts)、MCP(模型上下文协议)服务器、Agent 技能(Agent Skills)和自定义命令打包成一个用户友好的格式。无论你是想为团队内部构建特定的工作流,还是想向开源社区分享你的 AI 工具,Gemini CLI 扩展都能轻松满足。
本文将基于官方文档,详细介绍 Gemini CLI 扩展的工作原理、开发流程、最佳实践以及如何发布你的扩展。
简单来说,Gemini CLI 扩展(Extensions)是一个包含配置和代码的目录,用于扩展 CLI 的原生能力,它的核心功能包括:
/fs:grep-code)。启动时,Gemini CLI 会在 ~/.gemini/extensions/ 目录下查找扩展,每个扩展的核心是 gemini-extension.json 配置文件。如果存在冲突(例如扩展命令与用户命令同名),扩展命令会自动添加扩展名前缀进行冲突解决(例如 /gcp.deploy)。
从零开始,创建一个包含 MCP 服务器和自定义命令的扩展。
确保已经安装了 Gemini CLI 以及 Node.js / TypeScript 环境。
Gemini CLI 提供了现成的模板,运行以下命令,使用 mcp-server 模板创建名为 my-first-extension 的扩展:
gemini extensions new my-first-extension mcp-server
bash
这会生成一个包含 gemini-extension.json、package.json 和 TypeScript 源码的目录结构。
这是扩展的“身份证”,定义了扩展如何被加载:
{
"name": "my-first-extension",
"version": "1.0.0",
"mcpServers": {
"nodeServer": {
"command": "node",
"args": ["${extensionPath}${/}dist${/}example.js"],
"cwd": "${extensionPath}"
}
}
}
json
小贴士:使用
${extensionPath}变量可以确保扩展无论安装在何处,路径都能正确解析。
在 example.ts 中,可以注册自定义工具。例如,注册一个获取网络数据的工具 fetch_posts:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
// ... 省略 imports
const server = new McpServer({ name: 'prompt-server', version: '1.0.0' });
server.registerTool('fetch_posts', {
description: '从公共 API 获取帖子列表。',
inputSchema: z.object({}).shape,
}, async () => {
const apiResponse = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts = await apiResponse.json();
return { content: [{ type: 'text', text: JSON.stringify(posts.slice(0, 5)) }] };
});
typescript
在开发阶段,我们使用 link 命令将开发目录链接到 CLI 扩展目录,这样改动可以实时生效:
cd my-first-extension
npm install
npm run build
gemini extensions link .
bash
重启 Gemini CLI 后,你就可以对 AI 说:“Fetch posts” 来测试你的新工具了。
在扩展目录下创建 commands/fs/grep-code.toml:
prompt = """
请总结以下模式的搜索结果 `{{args}}`。
搜索结果:
!{grep -r {{args}} .}
"""
toml
重启后,可以运行 /fs:grep-code "console.log",AI 会自动帮你搜索并分析代码。
在根目录创建 GEMINI.md,并在 gemini-extension.json 中配置 "contextFileName": "GEMINI.md"。这里的文本会作为系统提示词加载,指导 AI 如何使用你的扩展。
在 skills/security-audit/SKILL.md 中定义安全审计技能。当用户询问“检查安全漏洞”时,CLI 会自动激活这个技能,而不需要常驻内存。
如果扩展需要 API Key,不要硬编码。使用 gemini-extension.json 中的 settings 字段:
"settings": [
{
"name": "API Key",
"description": "Your API key for the service.",
"envVar": "MY_API_KEY",
"sensitive": true
}
]
json
安装时,CLI 会安全地提示用户输入,并保存在扩展目录下的 .env 文件中。
在配置和 Hook 中,善用以下变量:
${extensionPath}: 扩展安装路径${workspacePath}: 当前工作区路径${/}: 跨平台的路径分隔符作为用户或开发者,你常用以下命令来管理扩展:
gemini extensions install <github-url-or-local-path>gemini extensions update <name> (更新所有扩展可加 --all)gemini extensions disable <name> --scope workspace (支持工作区级别隔离)gemini extensions uninstall <name>开发完成后,如何分享给全世界?Gemini CLI 支持两种发布模式:
最简单的方法。只需将代码推送到公开的 GitHub 仓库,用户即可通过 URL 安装:
gemini extensions install https://github.com/your-name/your-extension
bash
Release Channels 管理:用户可以通过
--ref=stable安装特定分支。你可以用dev分支开发,稳定后 Merge 到stable或默认分支。
对于包含编译步骤(如 TypeScript 构建)或特定平台二进制文件的扩展,GitHub Releases 是最佳选择。用户下载的是打包好的压缩文件,速度更快。
自动化发布最佳实践 (GitHub Actions):
利用 GitHub Actions 自动构建多平台包。包的命名规范必须遵循:{平台}.{架构}.{扩展名}.{压缩格式},例如 darwin.arm64.my-tool.tar.gz。
## 示例 GitHub Action 步骤片段
- name: Create release assets
run: |
npm run package -- --platform=darwin --arch=arm64
npm run package -- --platform=linux --arch=x64
npm run package -- --platform=win32 --arch=x64
yaml
当配置正确时,Gemini CLI 会自动检测用户的操作系统(macOS/Linux/Windows)并下载匹配的架构包。
Gemini CLI 的扩展机制极其灵活且对开发者友好。从简单的 Prompt 集合到包含复杂 MCP 逻辑的本地工具库,它都能轻松胜任,赶紧动手开发你的第一个扩展,打造属于你自己的超级 AI 命令行吧!
参考文档:
码字不易,如果本文对您有帮助,欢迎点赞、收藏并在评论区分享你的 Gemini CLI 扩展想法!

随着大模型技术的爆发,如何在终端(Terminal)高效地与 AI 交互成为了开发者关注的焦点,今天我们来聊聊 Gemini CLI —— 一个不仅能让你在命令行畅玩 Gemini 模型,还拥有强大插件系统和严谨架构的开源工具。无论你是想高效使用 Gemini,还是想学习如何开发一个高质量的 AI CLI 工具,这篇文章都能带你一探究竟。
简单来说,Gemini CLI 是一个交互式的 REPL(Read-Eval-Print Loop)环境,它将 Google Gemini 模型的强大能力直接带入了本地的终端。
不像简单的 API 调用脚本,Gemini CLI 是一个成熟的生产力工具,它具备以下特性:
了解工具的架构不仅有助于使用,更是学习优秀系统设计的良机。根据官方的 架构文档,Gemini CLI 采用了前后端分离的设计理念(尽管它们都运行在本地)。
Gemini CLI 主要由两个核心包组成:
packages/cli (前端/客户端):
packages/core (后端/核心):
当你在终端输入一条命令时,由于系统内部发生了一系列精妙的流转:
Step 1 用户输入: :你在 packages/cli 提供的界面中输入 Prompt。
Step 2 请求转发: :CLI 将输入发送给 packages/core。
Step 3 Prompt 构建与 API 请求: :Core 层构建包含上下文和工具定义的 Prompt,发送给 Gemini API。
Step 4 模型决策:
Step 5 工具执行: :
Step 6 最终响应:API 生成最终回答,Core 将其传回 CLI,CLI 渲染展示给用户。
这种 模块化(Modularity) 设计使得开发者可以轻松替换前端 UI,或者将 Core 复用到其他应用中。
Gemini CLI 是开源的,如果你想为它贡献代码,或者想魔改一个属于自己的版本,官方的 贡献指南 非常详尽。以下是核心步骤的精简版。
nvm 可以轻松切换。Step 1. Fork & Clone:
git clone https://github.com/google-gemini/gemini-cli.git
cd gemini-cli
npm install
bash
Step 2. 构建:
npm run build # 构建所有包
## 或者
npm run build:all # 构建包 + 沙箱容器(推荐)
bash
Step 3. 运行与调试:
npm startF5 或运行 npm run debug。DEV=true npm start
## 在另一个终端运行
npx react-devtools@4.28.5
bash
在提交 PR 之前,务必运行“起飞前检查”:
npm run preflight
bash
这个命令会执行 ESLint、Prettier 格式化以及所有的单元测试,确保你的代码符合规范。
packages/cli,可以在 PR 评论中运行 /review-frontend <PR_NUMBER>,官方提供了一个实验性的工具来自动审查 React 反模式。/assign 即可认领(每人最多同时认领 3 个)。Gemini CLI 展示了现代 AI 命令行工具应有的样子:人性化的交互、安全的沙箱机制以及清晰解耦的架构。
本文基于 Gemini CLI 官方文档整理,技术在不断迭代,建议以官方最新文档为准。参考:
希望本文能帮助到大家,谢谢阅读,本文完!

我们不应把 Gemini 简单理解为“聊天版 AI”,它更像是 嵌入在搜索、办公、开发与操作系统中的通用智能引擎。Gemini 3 的核心变革在于:
Gemini 提供了零门槛到深度集成的多种使用形态:
| 使用形态 | 定位与适用场景 |
|---|---|
| Web / 移动端 App | 零门槛日常创作、多模态实时交互 (Live API)。 |
| Gemini CLI | 核心推荐:终端里的 AI 助手,适合代码开发、自动化运维。 |
| API / SDK / AI Studio | 工程化集成,支持长上下文、工具调用与产品化。 |
| Antigravity (IDE) | 高级开发者 / Agent 玩家,让 AI 代理自动写代码、跑命令的 IDE。 |
npm install -g @google/gemini-cli。(Windows 强烈推荐使用 WSL 环境)。Gemini CLI 采用模块化设计:
packages/cli):负责 UI 渲染(使用 React 终端 UI)、用户输入和主题。packages/core):负责 Prompt 构建、与 Gemini API 通信以及工具(Tools)的执行。Gemini CLI 拥有一套严谨的配置优先级(从高到低):命令行参数 > 环境变量 > 系统设置(System) > 项目设置(Workspace) > 用户设置(User) > 默认值。
最佳实践: 敏感 API Key 用 环境变量;项目规范用 项目级
settings.json;临时改动用 命令行参数。
Gemini CLI 提供了极其丰富的控制台交互能力:
/ (斜杠 - 系统命令):控制 CLI 元数据。如 /model (切换模型)、/memory (刷新上下文)、/restore (快照恢复)、/mcp (管理外部服务)。@ (At - 上下文注入):将文件或目录无缝注入 Prompt。支持 Git 过滤,如 @src/my_project/ 总结代码。! (感叹号 - Shell透传):直接在 AI 环境执行系统命令,如 !git status。你可以使用 .toml 文件将常用指令沉淀为快捷命令(如 /git:commit)。
{{args}}:动态注入用户输入。!{...}:执行 Shell 命令并注入其标准输出(如 !{git diff})。@{...}:注入指定文件内容。专为 CI/CD 和自动化脚本设计。
gemini --prompt "..." --output-format json (或 stream-json)cat code.py | gemini -p "找 Bug" > report.txt。这是 Gemini CLI 拉开生产力差距的关键,主要由 Tools、Skills、Hooks、Extensions 四大模块组成。
赋予大模型操作物理世界的能力:
list_directory, read_file, write_file, replace (智能正则修正)。google_web_search (防幻觉)、web_fetch (实时抓取)。write_todos 帮助 AI 将复杂任务拆解为多步列表。解决全局 GEMINI.md 过度消耗 Token 的痛点。
SKILL.md 目录。平时只加载元数据,当用户提到“触发词”时,精准按需加载。通过标准的 stdin/stdout 进行进程间通信(IPC),在 AI 的生命周期中进行拦截:
BeforeAgent:注入实时项目上下文。BeforeTool:安全拦截,检测到 rm -rf 等危险命令时直接熔断。AfterTool:对输出结果进行脱敏(如隐藏密码)。将 Tools (MCP)、Skills、Commands、Hooks 打包成 gemini-extension.json。支持通过 Git 或 GitHub Releases 一键分发给团队或社区。
在企业落地时,Gemini CLI 提供了严格的安全与可观测性保障:
原理:AI 每次修改文件前,自动在隐藏影子仓库(~/.gemini/history/)做 Git 快照。
价值:允许 AI 大胆重构,随时通过 /restore 命令回滚到工具执行前的状态,确保代码安全。
AI 执行的所有 Shell 命令都可以被关进沙箱,避免误删系统文件。
gemini -s 或配置 GEMINI_SANDBOX=docker。disableYoloMode: true 强制要求人工确认。tools.core 配置仅允许使用的安全工具(如只读工具)。allowed 和 includeTools 控制第三方服务的数据访问。Google Gemini 3 的发布,标志着 AI 辅助开发范式的全面升级:
一句话原则:善用 settings.json 定制基础体验,用环境变量管密钥,用上下文文件 (GEMINI.md) 让模型懂你,用 Tools 和 Hooks 拓展边界。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。