惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cyberwarzone
Cyberwarzone
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
C
Cisco Blogs
博客园 - 【当耐特】
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
B
Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
The Last Watchdog
The Last Watchdog
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Project Zero
Project Zero
WordPress大学
WordPress大学
L
LINUX DO - 最新话题
F
Fortinet All Blogs
L
LINUX DO - 热门话题
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
爱范儿
爱范儿
O
OpenAI News
J
Java Code Geeks
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More

博客园 - CharyGao

OpenAI Codex AI降智解决方案, 原因解析与系统提示词修改指南 OpenClaw vs Coze/Dify/n8n 帮你半小时内选对合适的AI Skills 热潮过去后,我重新理解了 AI Agent 的方向 智读致用|《埃隆之书》 《一人企业》 一人公司:The Agency 免费“雇佣“144个AI专家,虚拟团队走进现实 用微软Agent Framework打造智能博客生成系统+AI智能体军团 告别加班(第二期):月报还是Word排版?本地AI解您愁 居然可以在 Claude 桌面端用三方模型了! Claude Code 每次启动都要确认权限?一行配置永久解决 98.5% 的人都不知道:SSH 居然还有个“隐藏菜单” 强程序员在 AI 时代的赚钱路径 骚操作来了!Claude编程的42个实战技巧大全 面试官:“简历写着熟练使用 Claude Code,连 simplify 代码审查命令都不知道!”,我:“那又如何呢?” SpringBoot+ResponseBodyEmitter异步流式推送神技 加密后的数据如何进行模糊查询? 最适合新手安装的10个小龙虾🦞 skills来了! 周末和孩子必看的亲子电影合集,陪伴孩子成长的每一步 拒绝代码泄露与“屎山”迷航:GitNexus纯本地知识图谱+可视化关系网,引发GitHub 8800星狂欢 还原BatchEncryption(201610版本)混淆的批处理文件 用上这个Skill,你的Claude Code/Codex 将会比别人快5倍 -- 用分布式思维驯服AI任务编排 前端项目中定义vs code要安装的插件 vscode中claude code插件代理地址设置 2026新手必学:GPT-5.5高效提示词指南 解决 URLEncoder.encode 编码空格变 + 号 Springboot通过谷歌Kaptcha 组件,生成图形验证码 HTTP 与 SpringBoot 参数提交与接收协议方式 SpringBoot多线程池配置 springboot使用logback自定义日志 SpringBoot + Cursor 最佳提示词工程手册 scoop国内安装方法 Prompt 工程实战总结:文本分类、信息抽取、语义匹配 PowerShell DSC(Desired State Configuration)实战指南 OpenResty Lua 代码断点 调试指南:VSCode + LuaPanda OpenClaw多智能体路由实战:飞书多机器人配置指南 OpenClaw 提示词全集 (Prompt Collection) n8n 2.0 中文汉化版一键部署教程 | 解除Execute Command限制 java中Redisson ,jedis,Lettuce和Spring Data Redis的四种深度对比和优缺点详解 Java Web 技术演进:Servlet → Spring → Spring Boot Everything Claude Code(Anthropic 黑客松冠军开源配置) 从 ChatGPT 到 Coding Agent:AI 执行时代的未来猜想 Codex 全面实战教程:从安装到工程协作,一篇跑通 3万字硬核拆解 Claude Code:从入门到工程化落地 Gemini 3 完整指南 Codex 完整指南 Claude Code 完整指南4-10 Claude Code 完整指南 claude code 自动保存对话插件 提示词99+ 拜拜Cursor,你好Kiro!(附全平台安装包下载,Win、Mac、Linux) 别再忍了!uv 下载慢如龟速?一招配置国内镜像,让你的 Python 体验坐上火箭! docker配置参数详解---/etc/docker/daemon.json完整参数 win11 清理 OpenCowork 让 AI 在飞书里真正「动手干活」 教你从0到1安装OpenClaw,快速接入飞书,打通任督二脉! SpringBoot 最大连接数及最大并发数是多少??? SpringBoot vs Nginx:5种实现vs1个指令,谁才是防盗链的“真·王者”? Spring Boot日志集成 Redisson 使用手册:从 API 误区到看门狗失效,在此终结分布式锁的噩梦 OpenClaw超级速查表 zeroclaw ubunut25 -ARM 修改国内镜像 openClaw国内镜像安装 知识图谱 —— 结构化知识的强大工具 什么是 Supervised learning(监督学习) 机器学习中的过拟合与欠拟合现象:理论与实践案例研究 解析 Anthropic 的模型上下文协议(MCP)及其优点
【万字长文】Gemini 3 Pro 全面指南:从免费订阅到 CLI / Agent 实战
CharyGao · 2026-04-23 · via 博客园 - CharyGao
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

4.16 telemetry

为 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。

4.17 settings.json 示例

下面是一个具有嵌套结构的 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

4.18 命令历史记录

CLI 会保留你运行过的 shell 命令历史记录。为避免在不同项目之间发生冲突,该历史记录会存储在你用户主目录下的项目专用目录中。

位置: ~/.gemini/tmp/<project_hash>/shell_history

  • <project_hash> 是根据你项目的根路径生成的唯一标识符。
  • 历史记录存储在名为 shell_history 的文件中。

4.19 环境变量

环境变量是配置应用程序的常见方式,尤其适用于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 设置来自定义此行为。

4.19.1 变量参数

环境变量 说明 备注 / 示例
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 的端点。 用于开发与测试

4.19.2 环境变量脱敏

为防止敏感信息意外泄露,Gemini CLI 在执行工具(例如shell 命令)时,会自动从环境变量中打码潜在的秘密信息。这种“尽力而为”的打码适用于从系统继承的变量或从 .env 文件加载的变量。

默认打码规则:

  • 按名称: 若变量名包含敏感词,如 TOKENSECRETPASSWORDKEYAUTH``CREDENTIALPRIVATE 或 CERT,则会被打码。
  • 按值: 若变量值匹配已知的秘密模式,则会被打码,例如:私钥(RSA、OpenSSH、PGP 等)、证书、包含凭据的 URL、API key 与 token(GitHub、Google、AWS、Stripe、Slack 等)
  • 特定黑名单: 某些变量如 CLIENT_IDDB_URIDATABASE_URL 和 CONNECTION_STRING 默认总会被打码。

白名单(永不打码):

  • 常见系统变量(例如 PATHHOMEUSERSHELLTERMLANG)。
  • 以 GEMINI_CLI_ 开头的变量。
  • GitHub Action 特有变量。

你可以在 settings.json 文件中自定义该行为:

  • security.allowedEnvironmentVariables: 一个变量名列表,用于
    永不 打码,即使它们匹配敏感模式。
  • security.blockedEnvironmentVariables: 一个变量名列表,用于
    总是 打码,即使它们不匹配敏感模式。
{
  "security": {
    "allowedEnvironmentVariables": ["MY_PUBLIC_KEY", "NOT_A_SECRET_TOKEN"],
    "blockedEnvironmentVariables": ["INTERNAL_IP_ADDRESS"]
  }
}

json

4.20 命令行参数

在运行 CLI 时直接传入的参数可以覆盖该会话中的其他配置。

  • --model <model_name> (-m <model_name>):

    • 指定本次会话使用的 Gemini model。
    • 示例:npm start -- --model gemini-3-pro-preview
  • --prompt <your_prompt> (-p <your_prompt>):

    • 用于将 prompt 直接传给命令。这会以非交互模式调用 Gemini CLI。
    • 对于脚本示例,使用 --output-format json 标志以获得结构化输出。
  • --prompt-interactive <your_prompt> (-i <your_prompt>):

    • 启动交互会话,并将所提供的 prompt 作为初始输入。
    • prompt 会在交互会话中处理,而不是在此之前。
    • 当从 stdin 通过管道传入输入时不可用。
    • 示例:gemini -i "explain this code"
  • --output-format <format>:

    • 描述: 指定非交互模式下 CLI 输出的格式。
    • 取值:
      • 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]):

    • 恢复先前的聊天会话。对最近的会话使用 “latest”,提供会话索引编号,或提供完整的会话UUID。
    • 若未提供 session_id,则默认为 “latest”。
    • 示例:gemini --resume 5 或 gemini --resume latest 或 gemini --resume a1b2c3d4-e5f6-7890-abcd-ef1234567890 或 gemini --resume
  • --list-sessions:

    • 列出当前项目的所有可用聊天会话并退出。
    • 显示会话索引、日期、消息数量,以及第一条用户消息的预览。
    • 示例:gemini --list-sessions
  • --delete-session <identifier>:

    • 通过索引编号或完整会话 UUID 删除特定聊天会话。
    • 请先使用 --list-sessions 查看可用会话、它们的索引与UUID。
    • 示例:gemini --delete-session 3 或 gemini --delete-session a1b2c3d4-e5f6-7890-abcd-ef1234567890
  • --include-directories <dir1,dir2,...>:

    • 为多目录支持包含额外目录到工作区。
    • 可以多次指定或使用逗号分隔的值。
    • 最多可添加 5 个目录。
    • 示例:--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 响应的文件路径,用于测试。

4.21 上下文文件(Context Files)

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。

4.21.1 示例 context file 内容

下面是一个概念性示例(例如 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。典型加载顺序为:

  1. 全局 context file:
    • 位置:~/.gemini/<configured-context-filename>(例如
      用户主目录中的 ~/.gemini/GEMINI.md)。
    • 作用域:为所有项目提供默认说明。
  2. 项目根目录及祖先目录的 context files:
    • 位置:CLI 会在
      当前工作目录中搜索配置的 context file,然后在每个父目录中继续搜索,直到
      项目根目录(由 .git 文件夹标识)或用户主目录。
    • 作用域:为整个项目或其重要部分提供相关 context。
  3. 子目录 context files(上下文/本地):
    • 位置:CLI 还会在
      当前工作目录 下方 的子目录中扫描配置的 context file(遵循 node_modules.git 等常见
      忽略模式)。该搜索的广度默认限制为 200 个目录,但可通过 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 的响应更好地定制为符合你的特定需求与项目。

4.22 沙箱

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

4.23 使用统计

为了帮助我们改进 Gemini CLI,我们会收集匿名化的 usage statistics。该数据帮助我们了解 CLI 的使用方式、识别常见问题,并确定新功能的优先级。

我们收集的内容:

  • 工具调用: 我们记录被调用的工具名称、它们是否成功或失败,以及执行耗时。我们不收集传递给工具的参数或任何返回数据。
  • API 请求: 我们记录每次请求所使用的 Gemini model、请求耗时,以及是否成功。我们不收集prompts 或响应的内容。
  • 会话信息: 我们收集有关 CLI 配置的信息,例如启用的工具与 approval mode。

我们不收集的内容:

  • 个人身份信息(PII): 我们不收集任何个人信息,例如你的姓名、邮箱地址或 API key。
  • Prompt 与响应内容: 我们不会记录 prompts 的内容或 Gemini model 的响应内容。
  • 文件内容: 我们不会记录由 CLI 读取或写入的任何文件内容。

如何选择退出:

你可以随时通过将 settings.json 文件中 privacy 类别下的usageStatisticsEnabled 属性设置为 false 来选择退出 usage statistics 收集:

{
  "privacy": {
    "usageStatisticsEnabled": false
  }
}

json

4.24 小结

到这里,Gemini CLI 的整体配置体系就完整串起来了,理解它的关键,并不是记住所有配置项,而是掌握**“在什么场景下,用哪种方式配置”**,读者们可以按下面这个思路来使用 Gemini CLI:


一、长期稳定的偏好,用 settings.json

如果某个配置 每天都会用、希望一直生效,那就放进 settings.json

  • 常用模型(model.name
  • UI 行为(主题、是否隐藏 Banner、是否显示上下文信息)
  • 是否启用 sandbox
  • 工具白名单 / 自动批准策略
  • 会话保留策略、上下文压缩策略等

个人使用: 放在 ~/.gemini/settings.json

项目使用 / 团队协作: 放在项目根目录 .gemini/settings.json,让所有人 clone 后即生效


二、敏感或环境相关的值,用环境变量

凡是 API Key、Credential、不同机器不一样的配置,都不要写死在配置文件中:

  • GEMINI_API_KEY
  • GOOGLE_APPLICATION_CREDENTIALS
  • Telemetry / Sandbox / Debug 开关
  • CI 环境下的特殊参数

推荐做法是:

  • 本地:使用 .env 或 shell 配置文件
  • 项目:使用 .gemini/.env
  • CI/CD:使用平台提供的 Secret / Env 配置

这样既安全,又不会污染仓库。


三、只想临时改一次,用命令行参数

只是这一次想换模型、开 debug、跑脚本,不需要动任何配置文件:

  • 临时切模型:--model
  • 非交互调用:--prompt
  • 机器可读输出:--output-format json
  • 强制 sandbox / debug / resume 会话

命令行参数始终拥有最高优先级,适合测试、排错和自动化脚本。


四、真正提升效果的关键 Context Files(GEMINI.md)

如果希望 Gemini 更懂你的项目,而不仅仅是“能回答问题”,那么一定要使用 GEMINI.md 或自定义 context files:

  • 项目背景说明
  • 编码规范 / 风格约定
  • 目录结构说明
  • 工具使用约束
  • 团队协作规则

这部分内容会作为 system prompt 注入模型,是影响回答质量最直接、性价比最高的配置手段。


五、一句话使用原则

  • 默认行为不满意 → settings.json
  • 涉及密钥和环境差异 → 环境变量
  • 只想改一次 → CLI 参数
  • 想让模型“更聪明” → context files

理解并善用这套分层配置机制,就可以把 Gemini CLI 从“能用”,调教到“顺手、可控、可复用”。希望能帮助到大家,感谢阅读,本文完!


05 工程化与治理:Checkpoint、Sandbox、Telemetry 与企业最佳实践

在这里插入图片描述

本文是进阶篇”,重点整理 Gemini CLI 中更偏工程/企业落地的能力:

  • Checkpointing(检查点):AI 写文件前自动快照,随时回滚
  • 企业级集中式配置:系统默认值/覆盖项/用户/工作区的合并与优先级
  • 安全治理:工具白名单/黑名单、禁用 YOLO、MCP 工具治理、网络代理、审计遥测
  • Sandbox(沙箱):Docker/Podman/macOS Seatbelt 隔离执行
  • OpenTelemetry:日志/指标/Trace 可观测性,成本与治理更透明

5.1 Checkpointing(检查点)

原文地址:https://geminicli.com/docs/cli/checkpointing/

一句话解释: 当你允许 Gemini CLI 调用会“改文件”的工具(比如写文件、替换内容)时,它会先自动做一次项目快照,确保你随时能恢复到“改之前”的状态。

这让你可以更大胆地让 AI 做重构/批量修改,因为你知道——随时可撤销


5.1.1 工作原理

当你批准一个会修改文件系统的工具(例如 write_file 或 replace)时,CLI 会自动创建一个“检查点”。检查点包含:

  1. Git 快照(影子仓库提交)

    • CLI 会在一个特殊的影子 Git 仓库中创建一次提交
    • 影子仓库位置:~/.gemini/history/<project_hash>
    • 这不会干扰你自己项目的 Git 仓库(你的 .git 不会被动)
  2. 对话历史 :与 agent 的整个对话会被保存(方便恢复上下文)

  3. 工具调用信息 :即将执行的工具调用细节也会被记录(恢复后可重新执行/修改/忽略)


5.1.2 数据存放在哪?

所有检查点数据都会存储在本机:

  • Git 快照(影子仓库)~/.gemini/history/<project_hash>
  • 对话历史与工具调用 JSON:通常在
    ~/.gemini/tmp/<project_hash>/checkpoints

这也意味着它适合企业环境:不会把你的项目快照上传到远程仓库。


5.1.3 启用 Checkpointing

注意:--checkpointing 这个命令行标志已在 0.11.0 移除,现在只能通过 settings.json 开启。

在你的 settings.json 里添加:

{
  "general": {
    "checkpointing": {
      "enabled": true
    }
  }
}

json


5.1.4 使用 /restore 管理检查点

启用后,检查点会自动创建。管理它们用 /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

恢复后会发生三件事:

  • 项目文件回滚到快照状态
  • CLI 内对话历史恢复
  • 原始工具调用会再次出现(你可以重新运行/修改/忽略)

5.2 面向企业的 Gemini CLI(集中式配置 + 安全治理最佳实践)

企业里最常见的痛点是:

  • 大家配置不一致
  • 工具权限不可控
  • 网络、审计、合规无法统一管理

Gemini CLI 提供了 系统级配置 来解决这些问题。


5.2.1 系统设置文件

企业管理中最强大的工具是全局系统设置文件

  • system-defaults.json:系统默认基线(最低优先级)
  • settings.json:系统覆盖项(最高优先级,最终裁决)

CLI 会从 4 个文件合并配置(单值设置优先级如下):

  1. 系统默认值(system-defaults.json
  2. 用户设置(~/.gemini/settings.json
  3. 工作区设置(<project>/.gemini/settings.json
  4. 系统覆盖项(settings.json)最高

对数组/对象类型(如 includeDirectoriesmcpServers),是“合并”而不是直接覆盖。


5.2.2 合并示例

系统默认值(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:数组拼接(系统默认 → 用户 → 工作区 → 系统覆盖)

5.2.3 系统配置文件的位置(不同系统)

  • Linux:/etc/gemini-cli/settings.json
  • Windows:C:\ProgramData\gemini-cli\settings.json
  • macOS:/Library/Application Support/GeminiCli/settings.json
  • 可用环境变量覆盖:GEMINI_CLI_SYSTEM_SETTINGS_PATH

5.2.4 企业常用技巧

问题:用户可以自己 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


5.2.5 工具访问控制(白名单优先 + 禁用 YOLO 模式)

企业安全治理的核心目标:最小权限原则(Least Privilege)


5.2.5.1 coreTools(允许列表)

只允许安全的只读工具(示例:读文件 + 列目录):

{
  "tools": {
    "core": ["ReadFileTool", "GlobTool", "ShellTool(ls)"]
  }
}

json


5.2.5.2 excludeTools(阻止列表)

例如阻止删除命令:

{
  "tools": {
    "exclude": ["ShellTool(rm -rf)"]
  }
}

json

风险:黑名单是字符串匹配思路,聪明用户可能绕过。生产环境建议优先使用白名单。


5.2.5.3 禁用 YOLO 模式

目的:防止模型在没有明确批准的情况下执行工具。

{
  "security": {
    "disableYoloMode": true
  }
}

json


5.2.6 MCP(自定义工具)治理

如果你们用 MCP server(Model-Context Protocol)接入内部工具,就一定要理解:

  • mcpServers 会合并
  • 同名 server 的优先级:System > Workspace > User
  • 用户无法覆盖 system 定义,但可以新增“新名字”的 server(除非你用 allowed 限制)

5.2.6.1 限制 MCP 服务器暴露的工具(includeTools / excludeTools)

推荐 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


5.2.6.2 更安全的企业模式(system 中同时定义 + 加 allowed 白名单)

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

效果:

  • 用户新增的 server 名字不在 mcp.allowed → 直接被阻止
  • 同名 server 即使用户定义 → system 会覆盖

5.2.6.3 不安全模式(只定义 server 但不加 allowed)
{
  "mcpServers": {
    "corp-data-api": {
      "command": "/usr/local/bin/start-corp-api.sh"
    }
  }
}

json

风险:用户可以在自己 settings 里新增任意 server,最终会合并进可用工具列表。


5.3 Sandbox(沙箱)

原文地址:https://geminicli.com/docs/cli/sandbox/

沙箱的定位:在 AI 工具执行与宿主机之间加一道隔离层,避免误操作造成系统损坏。

沙箱方式有如下两种:

  • macOS Seatbelt(仅 macOS)sandbox-exec,轻量
  • Docker/Podman 容器沙箱:跨平台、隔离更强(推荐企业)

安装与验证方式如下:

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


启用优先级(从高到低):

  1. 命令行:-s/--sandbox
  2. 环境变量:GEMINI_SANDBOX=true|docker|podman|sandbox-exec
  3. settings:{"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

5.4 OpenTelemetry 可观测性

原文地址:https://geminicli.com/docs/cli/telemetry/

为什么需要可观测性?

  • 统计团队使用情况与功能采用率
  • 监控 token、延迟、失败率
  • 审计工具调用(谁在用什么工具做什么)
  • 成本优化(缓存 token、模型路由、重试行为)

5.4.1 核心配置项(settings.json / 环境变量)

所有遥测行为都由 .gemini/settings.json 控制,也可以用环境变量覆盖。

常见配置示例:

{
  "telemetry": {
    "enabled": true,
    "target": "gcp",
    "logPrompts": false
  }
}

json

企业建议:

  • enabled: true(开启)
  • logPrompts: false(不要采集 prompt 文本,避免敏感信息泄露)
  • target: gcp 或 local 看你们的后端

5.4.2 Google Cloud 遥测(推荐 Direct Export)

1)启用遥测:

{
  "telemetry": {
    "enabled": true,
    "target": "gcp"
  }
}

json

2)运行 CLI 并产生数据:

正常使用 gemini 即可。

3)查看(Console):

  • Logs / Metrics / Traces:在 Google Cloud Console 中查看

5.4.3 本地遥测

{
  "telemetry": {
    "enabled": true,
    "target": "local",
    "otlpEndpoint": "",
    "outfile": ".gemini/telemetry.log"
  }
}

json


5.4.4 典型企业 system settings 汇总示例

{
  "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


5.5 小结

到这里,Gemini CLI 的企业级与工程化能力就基本梳理完了。可以看到,Gemini CLI 的设计目标并不只是“提升个人编码效率”,而是从一开始就围绕 可控性、安全性与可运维性 来构建,这也是它能进入真实工程与企业环境的关键。


回顾一下本文涉及的几个关键能力:

  • Checkpointing:让 AI 的“写文件 / 重构 / 批量修改”变成一件可回滚、可恢复、可审计的事情 → 这是 AI 能真正进入生产仓库的前提

  • 集中式配置与优先级合并:系统 / 用户 / 工作区 / 覆盖项的多层合并 → 让“统一策略 + 灵活使用”不再是二选一

  • 工具治理 + MCP 安全模型:白名单优先、禁用 YOLO、MCP allowed + includeTools → 把 AI 的能力牢牢限制在“你允许的边界内”

  • Sandbox(沙箱执行):Docker / Podman / macOS Seatbelt → 即使 AI 出错,也被关在笼子里

  • OpenTelemetry 可观测性:日志、指标、Trace、成本、审计 → 让 AI 使用情况像任何一个后端服务一样“看得见、管得住”

感谢阅读,希望能帮助到大家,本文完!

06 Skills:按需加载的专家技能体系(Agent Skills)

在这里插入图片描述

如果要真正把 Gemini CLI 用到中大型项目团队协作场景中时,一个绕不开的问题也逐渐显现出来:

如何让 AI 在“知道得足够多”的同时,又不过度消耗上下文、避免被无关信息干扰?

传统的做法,往往是通过 PROMPT.mdGEMINI.md 等全局上下文文件,把所有背景知识一股脑塞给模型,随着项目演进,这类文件不可避免地变得臃肿、难维护,也越来越“吃 Token”。为了解决这一痛点,可以使用 —— Agent Skills

本文将围绕 Agent Skills 的设计理念、启用方式、目录规范以及一个完整的实战案例,带大家理解它是如何通过 “按需加载上下文”的方式,让 AI 真正具备 模块化、可复用、可治理的专家能

6.1 什么是 Agent Skills?

在传统的 AI 辅助开发中,我们通常会在项目根目录下放置一个类似于 PROMPT.md 或 GEMINI.md 的全局上下文文件。但这种做法有一个痛点:随着项目变大,全局背景信息会越来越多,不仅消耗大量的 Token,还可能让 AI 的注意力分散。

Agent Skills 就是为了解决这个问题而生的,它是 基于“Agent Skills 开放标准”构建的,简单来说,它将 特定领域的知识、操作流程和相关资源打包成一个独立的文件夹

它的核心逻辑是“按需加载” (On-demand expertise): AI 平时并不知道这些详细指令,只有当你提出相关需求时,Gemini 才会自动“激活”对应的技能,将相关上下文拉取到当前会话中。


四大核心优势:

  • 【按需加载 (Progressive Disclosure)】:初始阶段只加载技能的元数据(名称和描述),大幅节省 Context Tokens。
  • 【知识沉淀与共享】:可以将复杂的团队工作流(例如特定的代码审查规范、部署流程)打包,团队成员开箱即用。
  • 【可复用的工作流】:确保复杂的多步任务始终以一致的标准化流程执行。
  • 【资源捆绑】:不仅能写 Prompt,还能把脚本、模板、示例数据和指令打包在一起给 AI 使用。

6.2 启用与管理技能

注意: 该功能目前处于实验阶段,需要开启 experimental.skills 才能使用。你可以在 /settings 交互界面中搜索 “Skills” 进行开启。

Gemini CLI 会从三个主要位置自动发现技能(优先级依次降低):

  1. Workspace 技能 (.gemini/skills/):特定于当前项目的技能,建议提交到 Git 仓库与团队共享。
  2. User 技能 (~/.gemini/skills/):你的个人专属技能,在所有项目中均可使用。
  3. Extension 技能:随扩展程序安装的技能。

在终端中,可以使用 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>:管理技能开关

6.3 案例实战

创建一个 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 的运行机制在安全方面设计得很周到:

  1. 激活拦截:当 AI 想要激活某个技能时,CLI 会弹出一个用户确认提示,告知你技能的名称和请求访问的目录。
  2. 沙箱隔离:只有你批准后,SKILL.md 的内容才会被注入历史记录,对应的文件夹权限才会被开放给 AI。

6.4 技能编写建议

想要用好 Agent Skills,建议遵循以下几点:

① Description(描述)是重中之重:AI 激活技能的逻辑类似于函数的语义搜索,你的 description 应该包含具体的触发词。例如,不要写“擅长写代码”,而是写“当需要生成 React 组件或编写前端测试用例时使用”。


② 区分作用域 (Scope)

  • 将个人的提效工具放在 User 级别 (~/.gemini/skills/),比如“Git Commit Message 生成器”、“个人周报总结助手”。
  • 将团队规范放在 Workspace 级别 (.gemini/skills/),比如“团队特有 CI/CD 修复指南”、“微服务部署脚本助手”,并将其提交到 Git。

③ “Don’t Just Prompt, Automate” (结合脚本)

既然支持文件夹,就不要只在 SKILL.md 里写文字,如果技能是关于“日志分析”,不如在 scripts/ 下放一个 python 脚本专门抓取日志,并在 SKILL.md 里告诉 AI:“遇到错误时,先运行 scripts/fetch_logs.py 获取最新日志”。

6.5 小结

从本质上看,Agent Skills 并不是“又一种 Prompt 写法”,而是 Gemini CLI 在 Agent 架构层面迈出的关键一步:

它把“提示工程”从一次性的文本输入,升级为可版本化、可组合、可审计的能力模块。

通过 Agent Skills,你可以:

  • 把零散的 Prompt 沉淀为长期资产
  • 把个人经验升级为团队共享的专家能力
  • 把复杂流程从“靠记忆”变成“可自动执行的标准化工作流”

Agent Skills 几乎是一个绕不开、也非常值得尽早投入的能力。如果你觉得本文对你有帮助,欢迎点赞、收藏或关注,谢谢大家的阅读,本文完!


07 Tools:内置工具与工具调用模型

在这里插入图片描述

经过前面几篇文章的铺垫,相信大家已经能够顺利使用 Gemini CLI 完成日常开发任务,但在实际工程中,真正拉开效率差距的,并不是“会不会用命令”,而是是否理解 Gemini CLI 背后那套工具机制

Gemini CLI 并不是一个简单的对话式终端,而是通过一组高度模块化的 Tools,让大模型能够直接:

  • 感知并操作本地文件系统
  • 执行真实的 Shell 命令并基于结果继续推理
  • 获取最新的网络信息,避免模型幻觉
  • 记住项目规范与个人偏好
  • 在复杂任务中进行自我规划与状态管理
  • 甚至通过 MCP 协议对接外部系统

本文将聚焦 Gemini CLI 的核心工具体系,结合官方文档与真实案例,逐一拆解每类工具的设计目的、使用方式以及工程实践中的最佳用法。

7.1 核心工具深度解析

7.1.1 文件系统工具 (File System)

官方文档链接https://geminicli.com/docs/tools/file-system

这是与日常开发结合最紧密的工具集,赋予了 AI 操作本地代码库的能力。


list_directory (列出目录)

用于查看项目结构。AI 会自动读取项目中的 .gitignore 文件,智能过滤掉 node_modules 等无关文件,从而减少 Token 消耗并保持上下文简洁。


read_file (读取文件)

这是 AI 理解代码的核心途径。除了纯文本文件,它还支持读取图片、音频甚至 PDF。对于超大文件,该工具支持智能分页读取,防止撑爆模型的上下文窗口。


write_file (写入文件)

直接在本地创建或覆盖文件。如果路径中包含不存在的文件夹,它会自动创建完整的目录树。出于安全考虑,此操作默认需要用户在终端按回车确认。


search_file_content (内容搜索)

在代码库中搜索特定文本。其底层优先调用 git grep 命令,这使得它能够实现毫秒级的跨文件搜索,比传统的遍历快得多。


replace (智能替换)

极其强大的代码修改工具。与传统的正则匹配不同,它通过“上下文匹配”来修改文件。即使目标文件在你和 AI 对话期间发生了轻微的偏移(如加了换行),它的自我纠错机制也能精准定位修改位置,大大提高了安全性。


7.1.2 Shell 命令行工具 (Shell)

官方文档链接https://geminicli.com/docs/tools/shell

让 AI 替你执行 Git 操作、运行构建脚本,甚至启动开发服务器。


run_shell_command (运行命令)

AI 可以通过此工具执行任意系统命令,并捕获标准输出 (Stdout)、错误输出 (Stderr) 和退出码,支持在命令末尾添加 & 符号以启动后台进程。


交互式 TUI 支持

如果开启了交互模式,AI 甚至可以运行 vimhtop 或 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


7.1.3 网络获取与搜索

官方文档链接https://geminicli.com/docs/tools/web-fetch

摆脱本地环境限制,让 AI 获取实时资讯。


web_fetch (网页抓取)

单次请求最多可并发抓取 20 个 URL。如果目标网站屏蔽了 Gemini 的官方服务器 API,CLI 会自动降级,使用你的本地网络环境进行抓取,确保成功率。


google_web_search (谷歌搜索)

官方文档链接Web Search Tool

内置了 Google Search API。返回的结果不仅包含摘要信息,还会提供可验证的来源链接(Citations),确保信息的准确性。


7.1.4 记忆工具

官方文档链接https://geminicli.com/docs/tools/memory

避免每次对话都要重复介绍项目背景和代码规范。


save_memory (保存记忆)

该工具会将你的偏好信息永久写入 ~/.gemini/GEMINI.md 文件中。每次启动 CLI 时,系统会自动将该文件内容作为 System Prompt 的一部分加载。

最佳实践:建议仅用于存储核心元数据,如项目规范(“总是使用 TypeScript”)、代码风格偏好等,不建议存储大段的对话历史。


7.1.5 Todos 任务清单

官方文档链接https://geminicli.com/docs/tools/todos

面对长链条的复杂需求,AI 的思路容易发散,Todos 工具帮助 AI 进行“自我规划”。

write_todos (编写待办)

当接到复杂指令(如“初始化一个 React 项目”)时,AI 会先生成任务列表,每个任务包含 pendingin_progress 或 completed 状态。在执行过程中,你可以随时按 Ctrl+T 快捷键,弹出工作进度面板查看 AI 当前进展。


7.1.6 MCP 服务器集成

官方文档链接https://geminicli.com/docs/tools/mcp-server

MCP (Model Context Protocol) 是一种开放标准,通过它,Gemini CLI 的能力可以被无限扩展。

可以通过配置 MCP 服务器,让 Gemini CLI 连接到任何外部系统,例如公司内部的 Jira、本地的 MySQL 数据库,或者是 AWS 云资源。在终端输入 /mcp 即可进入交互式管理界面。


7.2 案例实践

接下来看看在真实场景中,Gemini CLI 是如何工作的。

案例一:自动化重构老旧代码 (结合 File System)

场景:接手老 React 项目,需将所有废弃的 componentWillMount 重构为 useEffect

  • 用户 Prompt“在 src 目录下找出所有使用 componentWillMount 的组件,理解逻辑,并用 useEffect 重构。”
  • AI 执行流glob 搜索 → read_file 阅读上下文 → replace 生成差异 Diff → 等待按回车确认→ 瞬间修改完毕。

案例二:一键排查并修复 CI/CD 报错 (结合 Shell)

场景:拉取新代码后,npm run test 终端爆红。

  • 用户 Prompt“帮我运行 npm run test,分析报错原因,修复代码并自动重新运行直到通过。”
  • AI 执行流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)

  • 第一天告诉 AI“记住:我们的后端是 Go,Git Commit 必须带上 Jira ID(如 feat: [JIRA-123]…)。”
  • 几天后日常开发
    • 用户“帮我把当前修改提交一下。”
    • AI:自动运行 git status,分析 Diff,生成 feat: [JIRA-123] 增加用户登录接口,无需重复提示规范!

案例五:全栈项目从 0 到 1 (结合 Todos)

  • 用户 Prompt“用 FastAPI 和 Vue3 初始化一个记账本,要有前后端目录和添加账单 API。”
  • AI 执行流:触发 write_todos,生成包含建目录、装依赖、写代码的 8 步清单,像流水线一样推进,永不“断片”。

案例六:化身临时 DBA (结合 MCP)

  • 前提:配置了 MySQL MCP Server。
  • 用户 Prompt“帮我查一下 users 表里 ID 为 10086 的用户,最近的 5 条金币消耗记录。”
  • AI 执行流:通过 MCP 读取表结构 (get_table_schema) → 自动写 SQL (run_sql) 以 Markdown 表格形式返回数据。

7.3 小结

本文参考:https://geminicli.com/docs/tools

本文从工具视角系统梳理了 Gemini CLI 的能力体系,重点解析了文件系统、Shell、网络搜索、记忆、Todos 以及 MCP 等核心工具的设计与使用方式。

这些工具共同构成了 Gemini CLI 的执行基础,使大模型能够在真实开发环境中完成“读代码、跑命令、查资料、记规范、推进任务”等工程行为 ,只有理解并合理组合这些工具,才能在实际项目中稳定、高效地发挥 Gemini CLI 的价值。感谢阅读,希望能帮助到大家,本文完!


08 Hooks:生命周期拦截与安全加固

在这里插入图片描述

在 AI 辅助开发的浪潮中,Gemini CLI 提供了一种将大模型能力无缝集成到终端的方法。然而,真正的生产力提升往往来自于“量身定制”。如何在 AI 开始写代码前,强行灌输你的项目架构图?如何在 AI 试图删除敏感文件时,紧急制动?

本文将带你深入探索 Gemini CLI 的核心定制机制——Hooks(钩子)。通过本文,你将掌握其底层 I/O 机制、全生命周期事件流。


8.1 核心架构

Gemini CLI 的运行机制是一个经典的智能体循环 (Agentic Loop):它接收输入,调用模型,解析意图,执行工具,再将结果反馈给模型。Hooks 是这个循环中的“拦截器”,它们在不修改 CLI 源码的情况下,通过标准输入输出(stdin/stdout)进行进程间通信(IPC)。

8.1.1 Hook 的基础配置 (hook.json)

要注册一个 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

8.1.2 进程间通信法则 (IPC Rules)

  • 输入 (Stdin):Gemini CLI 暂停循环,将当前上下文以 JSON 字符串形式灌入你的脚本。
  • 输出 (Stdout):你的脚本只能向 stdout 输出合法的 JSON 字符串,作为对 CLI 的响应。
  • 日志 (Stderr):所有的 console.log (非JSON)、调试信息、错误警告,必须且只能输出到 stderr。Gemini CLI 会捕获这些信息并在调试面板中展示。

注意:如果在 Python 中写了 print("Starting hook..."),或者在 Node 中写了 console.log("Fetching data"),会导致 CLI 接收到的 JSON 损坏,触发解析错误。


8.2 生命周期事件 (Hook Events Reference)

原文链接:https://geminicli.com/docs/hooks/reference

Gemini CLI 提供了极其细粒度的控制点,以下是智能体循环中触发 Hook 的顺序:

事件名称 (Event) 触发时机 典型应用场景
BeforeAgent 用户输入刚进来,AI 开始思考前。 上下文注入:附加代码规范、Git diff 历史。
BeforeModel CLI 即将向大模型发送网络请求前。 提示词改写:动态翻译、自动添加 Few-shot 示例。
AfterModel 大模型返回原始文本响应后。 内容审核:过滤违禁词、结构化解析输出。
BeforeTool CLI 解析出需要调用工具(如执行 bash、读写文件)时。 安全沙箱:拦截危险命令(如 rm -rf),防止密钥泄露。
AfterTool 工具执行完毕,结果即将发回给模型前。 结果脱敏:将执行结果中的敏感 IP、密码替换为 [REDACTED]
AfterAgent 整个交互轮次结束,最终回复呈现给用户后。 异步操作:记录日志到数据库、触发 Webhook 通知。

8.3 案例实践

原文链接:https://geminicli.com/docs/hooks/writing-hooks

8.3.1 案例一:[Node.js] 缓存高耗时操作 (最佳实践)

如果你的 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

8.3.2 案例二:[Python] 拦截危险的系统命令

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


8.4 数据结构参考 (Reference)

为了精确控制,你需要了解 CLI 会传入哪些数据,以及你可以返回哪些字段。

8.4.1 CLI 输入给 Hook 的数据 (stdin)

无论哪个事件,都会收到这个核心对象:

{
  "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

8.4.2 Hook 可以返回的控制字段 (stdout)

你的输出直接决定了 CLI 的下一步行为:

  • additionalContext (String): 在 prompt 后追加的不可见(对用户)上下文。
  • prompt (String): 直接覆盖用户的原始 prompt。
  • decision (“allow” | “deny”): 在 Tool 事件中,决定是否执行工具。
  • continue (Boolean): 设为 false 可在此轮次中强制停止整个循环。

8.5 小结

本文围绕 Gemini CLI 的 Hooks 机制 展开,系统性地介绍了其在智能体循环中的定位与工作原理,重点解析了 Hook 的基础配置方式、基于 stdin/stdout 的进程间通信规则,以及 Hooks 在 Agent 全生命周期中可介入的关键事件节点。感谢阅读,希望能帮助到大家,本文完!

09 Extensions:扩展打包、开发与发布

在这里插入图片描述

通过 Gemini CLI 扩展,可以将提示词(Prompts)、MCP(模型上下文协议)服务器、Agent 技能(Agent Skills)和自定义命令打包成一个用户友好的格式。无论你是想为团队内部构建特定的工作流,还是想向开源社区分享你的 AI 工具,Gemini CLI 扩展都能轻松满足。

本文将基于官方文档,详细介绍 Gemini CLI 扩展的工作原理、开发流程、最佳实践以及如何发布你的扩展

9.1 什么是 Extensions?

简单来说,Gemini CLI 扩展(Extensions)是一个包含配置和代码的目录,用于扩展 CLI 的原生能力,它的核心功能包括:

  • MCP 服务器集成:允许模型调用外部工具(如读取文件、调用 API、查询数据库)。
  • 自定义命令 (Custom Commands):为常用的复杂 Prompt 创建快捷指令(如 /fs:grep-code)。
  • Agent 技能 (Agent Skills):提供按需触发的专家能力和专门的工作流程。
  • 生命周期钩子 (Hooks):在 CLI 的特定生命周期事件中拦截和自定义行为。

9.1.1 扩展的工作原理

启动时,Gemini CLI 会在 ~/.gemini/extensions/ 目录下查找扩展,每个扩展的核心是 gemini-extension.json 配置文件。如果存在冲突(例如扩展命令与用户命令同名),扩展命令会自动添加扩展名前缀进行冲突解决(例如 /gcp.deploy)。


9.2 快速入门

从零开始,创建一个包含 MCP 服务器和自定义命令的扩展。

9.2.1 前置准备

确保已经安装了 Gemini CLI 以及 Node.js / TypeScript 环境。

9.2.2 初始化扩展

Gemini CLI 提供了现成的模板,运行以下命令,使用 mcp-server 模板创建名为 my-first-extension 的扩展:

gemini extensions new my-first-extension mcp-server

bash

这会生成一个包含 gemini-extension.jsonpackage.json 和 TypeScript 源码的目录结构。

9.2.3 理解核心文件 gemini-extension.json

这是扩展的“身份证”,定义了扩展如何被加载:

{
  "name": "my-first-extension",
  "version": "1.0.0",
  "mcpServers": {
    "nodeServer": {
      "command": "node",
      "args": ["${extensionPath}${/}dist${/}example.js"],
      "cwd": "${extensionPath}"
    }
  }
}

json

小贴士:使用 ${extensionPath} 变量可以确保扩展无论安装在何处,路径都能正确解析。

9.2.4 编写 MCP 工具代码 (example.ts)

在 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

9.2.5 构建与本地链接

在开发阶段,我们使用 link 命令将开发目录链接到 CLI 扩展目录,这样改动可以实时生效:

cd my-first-extension
npm install
npm run build
gemini extensions link .

bash

重启 Gemini CLI 后,你就可以对 AI 说:“Fetch posts” 来测试你的新工具了。


9.3 丰富扩展功能

9.3.1 添加自定义命令 (Custom Commands)

在扩展目录下创建 commands/fs/grep-code.toml

prompt = """
请总结以下模式的搜索结果 `{{args}}`。
搜索结果:
!{grep -r {{args}} .}
"""

toml

重启后,可以运行 /fs:grep-code "console.log",AI 会自动帮你搜索并分析代码。

9.3.2 提供持久上下文 (GEMINI.md)

在根目录创建 GEMINI.md,并在 gemini-extension.json 中配置 "contextFileName": "GEMINI.md"。这里的文本会作为系统提示词加载,指导 AI 如何使用你的扩展。

9.3.3 添加 Agent 技能 (Agent Skills)

在 skills/security-audit/SKILL.md 中定义安全审计技能。当用户询问“检查安全漏洞”时,CLI 会自动激活这个技能,而不需要常驻内存。


9.4 最佳实践与用法指南

9.4.1 用户环境配置 (Settings)

如果扩展需要 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 文件中。

9.4.2 巧用变量

在配置和 Hook 中,善用以下变量:

  • ${extensionPath}: 扩展安装路径
  • ${workspacePath}: 当前工作区路径
  • ${/}: 跨平台的路径分隔符

9.4.3 扩展管理日常用法

作为用户或开发者,你常用以下命令来管理扩展:

  • 安装gemini extensions install <github-url-or-local-path>
  • 更新gemini extensions update <name> (更新所有扩展可加 --all)
  • 启用/禁用gemini extensions disable <name> --scope workspace (支持工作区级别隔离)
  • 卸载gemini extensions uninstall <name>

9.5 如何发布?

开发完成后,如何分享给全世界?Gemini CLI 支持两种发布模式:

9.5.1 通过 Git 仓库发布(推荐日常迭代)

最简单的方法。只需将代码推送到公开的 GitHub 仓库,用户即可通过 URL 安装:

gemini extensions install https://github.com/your-name/your-extension

bash

Release Channels 管理:用户可以通过 --ref=stable 安装特定分支。你可以用 dev 分支开发,稳定后 Merge 到 stable 或默认分支。

9.5.2 通过 GitHub Releases 发布(适合生产环境)

对于包含编译步骤(如 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)并下载匹配的架构包。


9.6 小结

Gemini CLI 的扩展机制极其灵活且对开发者友好。从简单的 Prompt 集合到包含复杂 MCP 逻辑的本地工具库,它都能轻松胜任,赶紧动手开发你的第一个扩展,打造属于你自己的超级 AI 命令行吧!


参考文档

码字不易,如果本文对您有帮助,欢迎点赞、收藏并在评论区分享你的 Gemini CLI 扩展想法!


10 架构与贡献:CLI 组件解密与参与贡献

在这里插入图片描述

随着大模型技术的爆发,如何在终端(Terminal)高效地与 AI 交互成为了开发者关注的焦点,今天我们来聊聊 Gemini CLI —— 一个不仅能让你在命令行畅玩 Gemini 模型,还拥有强大插件系统和严谨架构的开源工具。无论你是想高效使用 Gemini,还是想学习如何开发一个高质量的 AI CLI 工具,这篇文章都能带你一探究竟。

10.1 Gemini CLI 是什么?

简单来说,Gemini CLI 是一个交互式的 REPL(Read-Eval-Print Loop)环境,它将 Google Gemini 模型的强大能力直接带入了本地的终端。

不像简单的 API 调用脚本,Gemini CLI 是一个成熟的生产力工具,它具备以下特性:

  • 丰富的工具集(Tools):它不仅仅是聊天。内置了文件系统操作(读写文件)、Shell 命令执行、网页抓取(Web Fetch)、Google 搜索、甚至管理你的代办事项(Todos)。
  • 扩展性(Extensions):支持安装和开发扩展,你可以像给 VS Code 装插件一样给它增强功能。
  • 沙箱机制(Sandbox):在执行系统命令或文件操作时,支持容器化的沙箱环境,确保你的主机安全。
  • 企业级特性:支持 Checkpointing(检查点保存会话)、Headless 模式(用于自动化脚本)、以及 Token 缓存优化。

10.2 架构解密

了解工具的架构不仅有助于使用,更是学习优秀系统设计的良机。根据官方的 架构文档,Gemini CLI 采用了前后端分离的设计理念(尽管它们都运行在本地)。

10.2.1 核心组件分离

Gemini CLI 主要由两个核心包组成:

packages/cli (前端/客户端)

  • 职责:负责“门面”工作,处理用户输入、管理历史记录、渲染 UI(使用 Ink 库构建的 React 终端 UI)、处理主题和配置。
  • 关键点:它专注于用户体验,不处理具体的 AI 逻辑。

packages/core (后端/核心)

  • 职责:这是“大脑”,它接收 CLI 的请求,构建 Prompt,与 Gemini API 通信,并管理工具(Tools)的注册与执行。
  • 关键点:所有的状态管理、对话上下文、以及工具调用的逻辑都在这里。

10.2.2 交互流程

当你在终端输入一条命令时,由于系统内部发生了一系列精妙的流转:

  • Step 1 用户输入: :你在 packages/cli 提供的界面中输入 Prompt。

  • Step 2 请求转发: :CLI 将输入发送给 packages/core

  • Step 3 Prompt 构建与 API 请求: :Core 层构建包含上下文和工具定义的 Prompt,发送给 Gemini API。

  • Step 4 模型决策

    • Gemini API 返回直接回复。
    • 或者,Gemini API 请求调用某个工具(比如“读取这个文件”)。
  • Step 5 工具执行: :

    • 如果是敏感操作(如写文件、执行 Shell),Core 层会请求用户确认(除非在沙箱或只读模式下)。
    • Core 执行工具,并将结果返还给 Gemini API。
  • Step 6 最终响应:API 生成最终回答,Core 将其传回 CLI,CLI 渲染展示给用户。

这种 模块化(Modularity) 设计使得开发者可以轻松替换前端 UI,或者将 Core 复用到其他应用中。


10.3 开发者指南:如何参与贡献?

Gemini CLI 是开源的,如果你想为它贡献代码,或者想魔改一个属于自己的版本,官方的 贡献指南 非常详尽。以下是核心步骤的精简版。

10.3.1 环境准备

  • Node.js 版本:开发环境下,官方强烈建议使用 Node.js ~20.19.0。这通常是因为上游依赖的特定问题,使用 nvm 可以轻松切换。
  • 包管理器:项目使用 npm。

10.3.2 开发工作流

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 start
  • 调试(VS Code):直接按 F5 或运行 npm run debug
  • UI 调试:由于 CLI 使用了 React,你可以使用 React DevTools 来调试终端 UI!
DEV=true npm start
## 在另一个终端运行
npx react-devtools@4.28.5

bash

10.3.3 提交代码前的检查 (Preflight)

在提交 PR 之前,务必运行“起飞前检查”:

npm run preflight

bash

这个命令会执行 ESLint、Prettier 格式化以及所有的单元测试,确保你的代码符合规范。

10.3.4 提 PR 流程

  • 关联 Issue:所有的 PR 必须关联一个现有的 Issue。
  • 前端自动化审查:如果你修改了 packages/cli,可以在 PR 评论中运行 /review-frontend <PR_NUMBER>,官方提供了一个实验性的工具来自动审查 React 反模式。
  • 分配:看到感兴趣的 Issue,评论 /assign 即可认领(每人最多同时认领 3 个)。

10.4 小结

Gemini CLI 展示了现代 AI 命令行工具应有的样子:人性化的交互安全的沙箱机制以及清晰解耦的架构

本文基于 Gemini CLI 官方文档整理,技术在不断迭代,建议以官方最新文档为准。参考:

希望本文能帮助到大家,谢谢阅读,本文完!


11 总结回顾:核心能力与最佳实践

在这里插入图片描述

11.1 Gemini 3 为何物?

我们不应把 Gemini 简单理解为“聊天版 AI”,它更像是 嵌入在搜索、办公、开发与操作系统中的通用智能引擎。Gemini 3 的核心变革在于:

  1. 原生多模态:从底层同时理解文本、图片、音频、视频和代码,并进行跨模态推理。
  2. Agent-First (智能体优先):AI 不再只是“回答”,而是具备了“执行”能力(读写文件、跑命令)。
  3. 生态闭环:结合 Antigravity (Agent-First AI IDE)、Google Workspace 等,成为系统级智能中枢。

11.1.1 使用形态矩阵

Gemini 提供了零门槛到深度集成的多种使用形态:

使用形态 定位与适用场景
Web / 移动端 App 零门槛日常创作、多模态实时交互 (Live API)。
Gemini CLI 核心推荐:终端里的 AI 助手,适合代码开发、自动化运维。
API / SDK / AI Studio 工程化集成,支持长上下文、工具调用与产品化。
Antigravity (IDE) 高级开发者 / Agent 玩家,让 AI 代理自动写代码、跑命令的 IDE。

11.2 环境准备与架构解密

11.2.1 极速安装与订阅

  • 订阅准备:利用美区环境与学生身份(Gmail + 米国地址),可薅取 Gemini 3 Pro 免费一年订阅。
  • CLI 安装:依赖 Node.js (>= 18.x),全局安装:npm install -g @google/gemini-cli。(Windows 强烈推荐使用 WSL 环境)。

11.2.2 CLI 架构(前后端分离)

Gemini CLI 采用模块化设计:

  • 前端(packages/cli:负责 UI 渲染(使用 React 终端 UI)、用户输入和主题。
  • 后端(packages/core:负责 Prompt 构建、与 Gemini API 通信以及工具(Tools)的执行。

11.2.3 配置体系(分层合并)

Gemini CLI 拥有一套严谨的配置优先级(从高到低):
命令行参数 > 环境变量 > 系统设置(System) > 项目设置(Workspace) > 用户设置(User) > 默认值

最佳实践: 敏感 API Key 用 环境变量;项目规范用 项目级 settings.json;临时改动用 命令行参数


11.3 操控艺术:交互与自动化

Gemini CLI 提供了极其丰富的控制台交互能力:

11.3.1 三大核心命令符号

  • / (斜杠 - 系统命令):控制 CLI 元数据。如 /model (切换模型)、/memory (刷新上下文)、/restore (快照恢复)、/mcp (管理外部服务)。
  • @ (At - 上下文注入):将文件或目录无缝注入 Prompt。支持 Git 过滤,如 @src/my_project/ 总结代码
  • ! (感叹号 - Shell透传):直接在 AI 环境执行系统命令,如 !git status
11.3.1.1 自定义命令与宏

你可以使用 .toml 文件将常用指令沉淀为快捷命令(如 /git:commit)。

  • {{args}}:动态注入用户输入。
  • !{...}:执行 Shell 命令并注入其标准输出(如 !{git diff})。
  • @{...}:注入指定文件内容。

11.3.2 无头模式 (Headless Mode)

专为 CI/CD 和自动化脚本设计。

  • 用法gemini --prompt "..." --output-format json (或 stream-json)
  • 价值:可以通过管道符(Pipe)与其他命令结合,例如:cat code.py | gemini -p "找 Bug" > report.txt

11.4 Agent 核心扩展能力矩阵

这是 Gemini CLI 拉开生产力差距的关键,主要由 Tools、Skills、Hooks、Extensions 四大模块组成。

11.4.1 Tools(工具:AI 的手和眼)

赋予大模型操作物理世界的能力:

  • 文件系统list_directoryread_filewrite_filereplace (智能正则修正)。
  • Shell 命令行:执行编译、Git 操作等,捕获 stdout/stderr。
  • 网络与搜索google_web_search (防幻觉)、web_fetch (实时抓取)。
  • Todos (规划)write_todos 帮助 AI 将复杂任务拆解为多步列表。
  • MCP (外部集成):通过标准协议对接 Jira、数据库等第三方系统。

11.4.2 Agent Skills(技能:按需加载的专家)

解决全局 GEMINI.md 过度消耗 Token 的痛点。

  • 机制:打包成 SKILL.md 目录。平时只加载元数据,当用户提到“触发词”时,精准按需加载。
  • 组成:Prompt + 脚本文件 (scripts) + 静态资源 (assets)。

11.4.3 Hooks(钩子:生命周期拦截器)

通过标准的 stdin/stdout 进行进程间通信(IPC),在 AI 的生命周期中进行拦截:

  • BeforeAgent:注入实时项目上下文。
  • BeforeTool安全拦截,检测到 rm -rf 等危险命令时直接熔断。
  • AfterTool:对输出结果进行脱敏(如隐藏密码)。

11.4.4 Extensions(扩展:分发与共享)

将 Tools (MCP)、Skills、Commands、Hooks 打包成 gemini-extension.json。支持通过 Git 或 GitHub Releases 一键分发给团队或社区。


11.5 企业级安全与治理

在企业落地时,Gemini CLI 提供了严格的安全与可观测性保障:

11.5.1 Checkpoint (检查点与回滚)

原理:AI 每次修改文件前,自动在隐藏影子仓库(~/.gemini/history/)做 Git 快照。
价值:允许 AI 大胆重构,随时通过 /restore 命令回滚到工具执行前的状态,确保代码安全。

11.5.2 Sandbox (沙箱隔离)

AI 执行的所有 Shell 命令都可以被关进沙箱,避免误删系统文件。

  • 支持方式:macOS Seatbelt、Docker、Podman。
  • 开启方式gemini -s 或配置 GEMINI_SANDBOX=docker

11.5.3 权限治理与可观测性

  • 禁用 YOLO 模式:通过配置 disableYoloMode: true 强制要求人工确认。
  • 工具白名单:通过 tools.core 配置仅允许使用的安全工具(如只读工具)。
  • MCP 治理:使用 allowed 和 includeTools 控制第三方服务的数据访问。
  • OpenTelemetry:将 Token 消耗、延迟、工具调用日志导出到 GCP 或本地,实现成本追踪与审计。

11.6 小结

Google Gemini 3 的发布,标志着 AI 辅助开发范式的全面升级

  1. 从“聊代码”到“改代码”:通过 File System Tools 和 Checkpoint 机制,AI 已经可以直接参与项目的读写与重构。
  2. 从“万能助手”到“模块化专家”:通过 Skills 机制和 Context 的分层加载,实现了低 Token 消耗下的高精度领域知识覆盖。
  3. 从“个人提效”到“工程化落地”:Headless 模式、Hooks 机制以及 OpenTelemetry 的支持,让 AI 可以作为标准组件嵌入到企业 CI/CD 流水线中。

一句话原则:善用 settings.json 定制基础体验,用环境变量管密钥,用上下文文件 (GEMINI.md) 让模型懂你,用 Tools 和 Hooks 拓展边界。