ExitPlanModeTool:退出 Plan Mode
ExitPlanModeTool:退出 Plan Mode它不是“结束规划”,而是“提交规划”ExitPlanModeTool 的名字容易让人误会。它真正做的并不是简单退出,而是: 当计划已经写好后,把计划提交给用户审批。 所以它代表的是 Plan Mode 的交付节点 ,不是随便离开规划态。 关键源码tools/ExitPlanModeTool/prompt.ts: 12Use this tool when you are in plan mode and have finished writing your planto the plan file and are ready for user approval. 这个 prompt 已经很明确了: 先写 plan file 再调用这个工具 让用户审批 调用链它和 AskUserQuestionTool 的边界这个边界 Anthropic 写得很死: 不确定需求:AskUserQuestionTool 计划写完求批准:ExitPlanModeTool 也就是说: 不要用普通提问工具去问“这个计划可以吗” 那是...
EnterPlanModeTool:进入 Plan Mode
EnterPlanModeTool:进入 Plan Mode它的本质是状态切换,不是提示词切换EnterPlanModeTool 的作用不是“让模型多想一会儿”,而是把当前会话切到一种新的运行状态:plan。 这意味着系统会同时改变: 权限模式 会话目标 用户交互预期 所以它本质上是一个 运行时状态切换工具 。 关键源码tools/EnterPlanModeTool/EnterPlanModeTool.ts: 123import { handlePlanModeTransition } from '../../bootstrap/state.js'import { applyPermissionUpdate } from '../../utils/permissions/PermissionUpdate.js'import { prepareContextForPlanMode } from '../../utils/permissions/permissionSet...
SkillTool:执行 Skills
SkillTool:执行 Skills它不是命令别名,而是技能运行时很多人第一次看到 /commit、/verify、/update-config 这类 skill,会以为它们只是更长 prompt 的快捷方式。但从源码看,SkillTool 明显比“文本别名”复杂得多。 它负责的是: 找到 skill 对应的 command 解析参数 处理本地 skill 和 MCP skill 必要时 fork 一个子 Agent 去跑 所以更准确的说法是: SkillTool 是 Claude Code 的技能执行器。 关键源码tools/SkillTool/SkillTool.ts: 123456import { builtInCommandNames, findCommand, getCommands,} from 'src/commands.js'import { runAgent } from '../AgentTool/runAgent.js' 文件里还有一段很关键: 123456as...
AskUserQuestionTool:向用户提问
AskUserQuestionTool:向用户提问这个工具为什么比“直接问一句话”更高级很多人第一次看到 AskUserQuestionTool,会觉得它不就是“向用户提问”吗?但在 Claude Code 里,它其实解决的是一个更深的问题: 当模型执行到一半需要补信息时,如何把“提问”做成正式、结构化、可交互的系统能力,而不是随手打一句自然语言。 这对于 Agent 产品特别重要,因为它关系到: 需求澄清 多选决策 方案比较 Plan Mode 中的信息补全 源码先看 schematools/AskUserQuestionTool/AskUserQuestionTool.tsx: 123456const inputSchema = z.strictObject({ questions: z.array(questionSchema()).min(1).max(4), answers: z.record(z.string(), z.string()).optional(), annotations: annotationsSchema(), metada...
TodoWriteTool:待办清单
TodoWriteTool:待办清单它不是普通 checklist,而是会话内任务外显TodoWriteTool 是 Claude Code 经典的轻量任务管理工具。它的作用不是替代正式任务系统,而是让模型在当前会话里把工作拆成一串可见的 todo。 你可以把它理解成: TodoWriteTool:轻量、会话内、快速追踪 TaskCreateTool 系列:结构化、正式任务系统 关键源码tools/TodoWriteTool/TodoWriteTool.ts: 123const inputSchema = z.strictObject({ todos: TodoListSchema().describe('The updated todo list'),}) 而真正的状态写回是: 1234567context.setAppState(prev => ({ ...prev, todos: { ...prev.todos, [todoKey]: newTodos, },})...
WebSearchTool:联网搜索
WebSearchTool:联网搜索这个工具到底做什么WebSearchTool 负责让 Claude Code 查询互联网的最新信息。它解决的核心问题不是“打开某个网页”,而是: 当主线程需要知道当前世界上最近发生了什么、某个产品最新文档是什么、某个问题有哪些公开资料时,如何安全地发起联网搜索。 所以它和 WebFetchTool 的区别一定要先记清: WebSearchTool:找信息源 WebFetchTool:读指定页面 在真实使用里,这两个工具经常是一前一后配合。 它的 schema 很简单,但能力很强tools/WebSearchTool/WebSearchTool.ts: 12345const inputSchema = z.strictObject({ query: z.string().min(2).describe('The search query to use'), allowed_domains: z.array(z.string()).optional(), blocked_domains: z.array(...
WebFetchTool:抓取网页
WebFetchTool:抓取网页这个工具到底做什么WebFetchTool 负责抓取一个已经知道 URL 的网页 ,把网页内容转成 Claude Code 更容易处理的文本,再根据传入的 prompt 提炼结果。 它和 WebSearchTool 的分工非常明确: WebSearchTool:帮模型去网上找结果 WebFetchTool:拿着确定的 URL 去读具体页面 所以你可以把它理解成: Claude Code 的“网页阅读器 + 小模型摘要器” 而不是“联网搜索工具”。 它的输入为什么只有两个字段tools/WebFetchTool/WebFetchTool.ts: 1234const inputSchema = z.strictObject({ url: z.string().url().describe('The URL to fetch content from'), prompt: z.string().describe('The prompt to run on the fetched content...
NotebookEditTool:编辑 Notebook
NotebookEditTool:编辑 Notebook它为什么不是普通版 FileEditTool.ipynb 文件虽然本质上是 JSON,但语义上它不是普通文本文件,而是: 一组有顺序的 cell 混合了 code / markdown 带输出、元数据、语言信息 如果直接把 Notebook 当普通文本改,最容易出现两类问题: 结构被破坏,文件打不开 只想改一个 cell,却误伤整个 notebook 所以 Claude Code 给它单独做了 NotebookEditTool。 关键源码tools/NotebookEditTool/NotebookEditTool.ts: 1234567export const inputSchema = z.strictObject({ notebook_path: z.string(), cell_id: z.string().optional(), new_source: z.string(), cell_type: z.enum(['code', 'markdown&...
GrepTool:搜索内容
GrepTool:搜索内容它是 Claude Code 最常用的“找线索”工具之一GrepTool 负责在文件内容里搜索文本或正则模式。在真实使用里,它常常是 Claude Code 排查问题、理解代码和定位实现的第一步。 如果你把 Claude Code 的常见动作拆开看,会发现很多轮对话其实都是: 先 Grep 再 Read 再判断要不要 Edit 所以 GrepTool 本质上是主循环里的“线索发现器”。 看它的 schema,就知道它不是简单字符串搜索tools/GrepTool/GrepTool.ts: 123456789101112131415const inputSchema = z.strictObject({ pattern: z.string(), path: z.string().optional(), glob: z.string().optional(), output_mode: z.enum(['content', 'files_with_matches', 'count...
GlobTool:查找文件
GlobTool:查找文件这个工具看起来简单,但位置非常关键GlobTool 做的事很直接:按文件名或通配模式找文件。但在 Claude Code 的主循环里,它其实承担的是: 把“我大概知道要找什么文件”变成“我已经定位到候选路径”。 很多复杂任务的第一步,都不是直接读文件,而是先缩小范围。GlobTool 就是这一步的标准入口。 先看它的输入定义tools/GlobTool/GlobTool.ts: 1234const inputSchema = z.strictObject({ pattern: z.string().describe('The glob pattern to match files against'), path: z.string().optional().describe('The directory to search in'),}) 这个 schema 很简单,但设计上很清楚: pattern:用来表达“想找什么” path:用来限制搜索范围 也就是说,Claude Code...