第十章 · 工具生态全景

10.2 终端原生:Claude Code / Gemini CLI

本节最后更新:2026-05-13
验证环境:无(纯理论章节)

工作原理

终端原生的 AI 编程工具(Claude Code、Gemini CLI)和其他 AI 工具最大的区别在于:它们能直接在你的文件系统上操作。

当你对 Claude Code 说"帮我重构这个函数"时,它不仅仅是生成代码片段等你复制粘贴。它可以直接读取你当前项目中的文件、理解整个项目的结构、修改代码文件、运行命令查看结果、并根据结果再次调整。

这意味着 Claude Code 是一个自主行动的 Agent,而不只是一个"问答机器人"。

Claude Code 的内部工作流程:

  1. 理解请求:它首先解析你的自然语言请求——"重构用户认证模块"→ 分解为子任务(分析现有代码、确定重构方案、找到相关文件、逐一修改)。
  2. 探索代码库:自动读取相关文件——它会在你项目中搜索 import 语句、函数定义、类型定义,直到它理解了你提到的"用户认证模块"包含哪些文件。
  3. 制定计划:在内部生成一个操作计划——"需要修改 auth.ts、middleware.ts 和 types.ts 三个文件"。
  4. 执行修改:在文件系统上直接修改文件——不是生成代码给你看,是直接写到文件中。
  5. 验证结果:运行测试或构建命令,确认修改没有破坏现有功能。
  6. 展示汇报:告诉你它做了什么、改了哪些文件、需要注意什么。

整个过程里你只需要在步骤 1 给出指令,在步骤 6 审查结果。中间的四个步骤 AI 自主完成。如果有人站在 Claude Code 后面看,会看到终端中的光标在跳动——AI 在读取文件、思考、写入文件、运行命令。

一个完整的重构对话实录(模拟):

你:"把项目中所有 console.log 替换成一个统一的 Logger 工具类,日志级别可配置。"

AI 内部行为:

- 扫描整个项目,找到所有出现 console.log 的文件(发现 12 个文件、47 处调用)。

- 在 src/utils/ 下创建 Logger.ts。

- 在每个包含 console.log 的文件中添加 import。

- 逐处替换为 Logger.info() / Logger.warn() / Logger.error()。

- 运行 npm run build,确认没有编译错误。

- 运行 npm test,确认所有测试通过。

AI 输出:"已完成。在 src/utils/Logger.ts 中创建了日志工具类(支持 debug/info/warn/error 四级,通过环境变量 LOG_LEVEL 控制)。修改了 12 个文件中的 47 处 console.log 调用。构建和测试均已通过。"

注意在这个过程中你没有给 AI 逐条指令——没有说"创建文件"、"添加 import"、"修改这一行"。你只表达了意图,AI 自主完成了所有细节。这在传统编程工具中是不可能的。

和传统 CLI 工具的区别

你用过命令行工具——git、npm、grep、sed。它们的特点是:你输入精确的指令,工具执行精确的操作。你告诉 git "commit -m 'xxx'",它就执行提交。你不说"commit",它永远不会主动提交。

Claude Code 完全不一样。你输入的是模糊的意图——"这个函数太长了,帮我拆成几个小函数"——它自己决定怎么拆、用什么名字、怎么组织代码文件。它不是一个"执行工具"——它是一个协作者

传统 CLI 和终端 AI 的关键差异:

维度传统 CLI终端 AI 工具
输入方式精确的指令模糊的意图
容错能力输入错一个字符就报错能理解"那个啥""上一个"等模糊表达
操作范围一次一个命令一次多个文件、多步操作
上下文理解无,每次都是独立执行有,可以"记住"之前的操作
学习成本需要记住命令和参数用自然语言,不需要记命令
可预测性高——做什么完全由你控制中等——AI 可能做出你没想到的选择
错误恢复报错后需要你手动排查可以自主读取错误信息并尝试修复
组合能力需要管道和脚本组合一条自然语言可以触发复杂组合

传统 CLI 的本质是"精确映射"——你告诉它具体做什么,它就精确地做。AI CLI 的本质是"意图理解"——你告诉它你想要的最终结果,它自己决定怎么实现。这两种模式不是谁替代谁——它们适用于不同的任务。当你需要"精确控制"(比如 git 操作中的某些特定步骤)时,传统 CLI 更可靠。当你需要"高效完成"(比如重构一个模块)时,AI CLI 更合适。

一个具体的对比场景:

任务传统 CLIClaude Code
替换所有 JSX 中的 className 顺序`grep -rl "className" src/ \xargs sed -i 's/className="\([^"]*\)"/className="\1"/g'`(20 分钟写正确正则)"把 src/ 下所有 className 属性的值按照'固定类名在前、动态类名在后'的规则重新排序"(一句话)
把回调函数改成 async/await需要逐个文件读、改、验证"把所有 .then() 回调改成 async/await 语法"(一句话)
找出未使用的 import 并清理npx ts-prune 看报告,然后手动删"清理所有未使用的 import 语句,但保留类型导入"(一句话)

终端原生 vs IDE 插件的关键差异

在 L1 和 L2 的比较中,有一个经常被忽略但至关重要的差异——上下文获取方式

L2(IDE 插件)的上下文来自"你当前正在看的文件"。AI 知道你光标在哪儿、你在编辑什么,但它不知道项目的其他部分发生了什么。当你问"这个函数在哪里被调用"时,IDE 插件需要开发者主动去搜索或提供信息。

L1(终端工具)的上下文来自"整个项目"。AI 可以自己决定需要看哪些文件、搜索哪些内容。你不需要告诉 AI "去看一下 auth.ts 文件"——它自己会去读。

这个差异在实际使用中的表现:

这不是说 IDE 插件不好——IDE 插件的优势是实时性和低摩擦。但在涉及多个文件或项目级理解的任务上,终端工具的"主动获取上下文"能力是质的差异。

适合的场景与人群

终端原生工具的优势在以下场景中尤其突出:

场景一:处理大型项目。

因为 AI 能看到完整的文件系统,它可以理解项目级的上下文。在重构、跨文件修改、架构调整等任务上,终端工具远远优于只能看到单个文件的编辑器插件。

举个例子:你的项目有 50 个文件,你说"把项目中的 API 调用全部从 fetch 换成 axios"。编辑器插件一次只能修改一个文件,你需要逐个文件告诉 AI 去改。但 Claude Code 可以一次扫描所有文件,找到所有使用了 fetch 的代码,全部替换为 axios,确保统一的错误处理模式。

这种"扫描全部→批量修改→统一验证"的能力,是终端原生工具最核心的竞争力。

更复杂的例子:你想把整个项目从 JavaScript 迁移到 TypeScript。这个任务涉及数百个文件、需要添加类型注解、需要处理 any 类型的兼容。在传统方式下,这是一个"按周计算"的任务。用 Claude Code,你可以分模块逐步完成——"先迁移 utils 目录"、"再迁移 components 目录"——AI 会在每个目录中逐个文件处理,处理完一个模块后运行 ts-check 验证,发现问题自动修复。

场景二:多步骤操作。

"修改代码 → 运行测试 → 根据结果再修改"这种循环,终端工具可以自主完成,不需要你在每一步之间手动复制粘贴。

示例流程:

更进一步,你可以让 AI 做"探索性修复":

这个过程中你甚至不需要告诉 AI "运行 npm run build"——你只说了"构建失败了",AI 自动决定执行构建命令来重现问题。这就是终端工具"自主行动"的本质。

场景三:自动化与脚本。

AI 可以直接在终端中执行命令——安装依赖、启动服务器、运行测试。这对于需要 AI 完成"编码之外的工作"的场景非常重要。

比如:"帮我初始化一个新的 Next.js 项目,配置 Tailwind,安装 Prisma 和 Supabase SDK,然后初始化 Git 仓库。"——AI 逐条执行命令,不需要你在每一步切换窗口。

你还可以让 AI 帮你处理那些"偶尔需要做一次但总是记不住步骤"的操作:

如果你有一定命令行经验、处理的是有一定规模的项目、希望 AI 不只是一个代码生成器而是一个真正的协作者——终端原生工具很适合你。

和 Claude Code 对话的最佳实践

使用终端原生工具和用聊天机器人不同——因为 AI 可以改变你的文件、运行你的命令,你需要学会一些新的对话技巧。

技巧一:明确任务边界。

好的指令:"在 src/components/ 下创建一个 SearchBar 组件,接受 onSearch 回调,使用 Ant Design 的 Input.Search。"

不好的指令:"帮我弄个搜索框。"——AI 不知道放在哪里、用什么 UI 库、接受什么参数。

终端 AI 能自主行动,但方向需要你来定。你给出的指令越清晰,AI 第一次就做对的概率越高。如果指令模糊,AI 可能做出了一个可用的东西,但和你想要的南辕北辙。

技巧二:分步骤给出复杂需求。

不要一次把所有需求丢给 AI——"帮我做一个用户管理系统,有登录、注册、密码重置、用户列表、角色管理、权限控制……"AI 可能会在一次回复中做不完,或在中途偏离方向。

更有效的方式是分步骤:"第一步,帮我在项目中添加用户登录功能,用 JWT 认证。" → 完成并确认后 → "第二步,在登录的基础上添加注册功能,注册时需要邮箱验证。" → 完成并确认后 → "第三步,添加用户角色管理……"

这种分步骤推进的方式,让你在每个阶段都能检查 AI 的输出、调整方向,而不是在最后发现某个部分不符合预期。

技巧三:让 AI 先计划再执行。

对于大型任务,先让 AI 制定计划,审查后再让它执行。比如:

"我需要在项目中添加一个用户通知系统——用户登录后可以看到未读通知。先告诉我你的计划,包括需要创建哪些文件、修改哪些现有文件、数据库结构怎么设计。"

AI 会输出一个计划。你看完后可以确认、调整、或提出补充要求。确认后再告诉 AI "按这个计划开始执行"。这个"先计划后执行"的模式,是避免 AI 做出你不想要的结果最有效的手段。

技巧四:善用"回滚"指令。

Claude Code 等工具通常支持 Git 操作,AI 可以在你确认之前创建 commit 或 stash。如果你对修改结果不满意,直接说:

"撤销刚才的修改,回到开始之前的状态。"

AI 会执行 git checkoutgit stash 来恢复。这意味着你可以更大胆地尝试——即使 AI 改错了,你也能轻松回退。

保持这个习惯:在让 AI 执行大规模修改前,先确认项目已经 commit 了当前状态。很多终端工具会自动帮你做这件事。

技巧五:让 AI 解释它做了什么。

AI 修改完代码后,让它解释修改的要点:

"总结一下你改了哪些文件、每个文件的改动要点、以及有什么需要我注意的地方。"

这个习惯有两个好处:

终端原生的额外价值

除了上面说的,终端原生工具还有一个容易被低估的价值:它改变了你和代码库的交互方式。

在传统开发中,你切换上下文是有"阻力"的——从"读代码"切换到"写代码"需要打开编辑器,从"写代码"切换到"运行测试"需要打开终端。每一次切换都在消耗注意力。Claude Code 把所有这些操作统一在终端中——你不需要切换窗口,不需要打开不同的工具,一个对话窗口完成所有操作。这种"单一交互点"的体验,对于保持"心流"状态非常有帮助。

更细致地拆解这种体验:

传统开发中,完成一个"修复 Bug → 运行测试 → 提交代码"的最小循环,你需要:

  1. 在编辑器中定位 Bug(2 分钟)
  2. 切换到终端运行测试确认 Bug(1 分钟)
  3. 切换回编辑器修改代码(5 分钟)
  4. 切换到终端运行测试确认修复(1 分钟)
  5. 切换到终端运行 git add/commit(1 分钟)

五次上下文切换,每次都要找回你之前的状态——打开的文件、执行的命令、终端中的位置。这些切换消耗的注意力比你想象的多得多。

在 Claude Code 中,这个循环变成:

  1. 在终端中说"修复 src/auth.ts 中的登录失败 Bug"(10 秒)
  2. AI 自主完成:读取代码 → 定位 Bug → 修改 → 运行测试 → 提交(AI 耗时)
  3. 你审查 AI 的修改总结(1 分钟)

你只做了一次"输入指令"和一次"审查结果",中间的切换全部消失了。

用 Claude Code 阅读代码的体验也完全不同。 在传统开发中,理解一个不熟悉的模块,你需要逐个打开文件、追踪引用、手动拼接整体图景。但在终端中,你可以直接问:

AI 会读取相关文件,整理出你需要的信息。你不需要自己"考古"。

本节要点
Vibe 练习

如果你已经安装了 Claude Code,做一个对比实验:

用同一个需求——"把这个目录下所有 .js 文件改名为 .ts,并修复所有类型错误"——分别用传统的命令行方式(grep、sed、mv 等)和 Claude Code 各做一次。比较两者的时间、准确率、以及你对过程的控制感。

如果你还没有安装 Claude Code:

先阅读第 11 章的安装指南完成安装,然后做上面的练习。这个练习会帮你最直观地理解"终端 AI 工具和传统终端工具的本质区别"——一个执行精确指令,一个理解模糊意图。

进阶练习:

打开一个你熟悉的项目(可以是 AI 生成的,也可以是自己写的),在 Claude Code 中问一个"你为什么不知道的问题"——比如:"这个项目中哪个文件的行数最多?哪些函数超过 50 行?哪些文件互相引用最频繁?"看看 AI 如何自主探索你的项目并找到答案。这个练习会让你体会到终端工具"读懂整个项目"的能力——这是 IDE 插件做不到的。