日习一技 - Claude Code
type: channel
link: https://i-study-everyday.online/category/claude-code/
description: Claude Code 学习笔记
items: Gemini CLI vs. Claude Code 功能对比
items: 将 Claude Code 集成到更多地方
items: 给 Claude Code 的工具加上钩子
items: 管理 Claude Code 的工具权限
items: 使用 MCP 让 Claude Code 集成外部工具
items: 学习 Claude Code 的工具使用（三）
items: 学习 Claude Code 的工具使用（二）
items: 学习 Claude Code 的工具使用
items: 学习 Claude Code 的命令行操作
items: 学习 Claude Code 的基本技巧

Gemini CLI vs. Claude Code 功能对比
type: item
date: 2025-07-09T06:33:00+00:00
description: 经过两周多的深度学习和体验，我们对 Claude Code 的基本功能和特性已经有了基本了解。而正在我们学习 Claude Code 的期间，Google 开源了另一款终端 AI 助手 ———— Gemini CLI，作为 Claude Code 的开源平替，它接入了 Google 顶级的 Gemini 2.5 Pro 大模型，而且使用个人账号登录即可免费使用，支持每分钟最多 60 次、每日最多 1000 次请求，引起了业界的广泛关注，仅用几天时间就获得了 52k+ 的星标。刚开始学习 Claude Code 的时候，我本来想着充 5 美刀体验体验，到后来又充了 10 美刀，直到最后，两周时间一共花了我 35 美刀，实在是贵的肉疼。相对来说，开源且免费的 Gemini CLI 用起来是真香，所以 Gemini CLI 发布后的第一时间，我也赶紧试用了一番，这篇文章就对两者的功能做一个全面的对比。安装与上手Gemini CLI 的安装和 Claude Code 一样便捷，都依赖于 npm 进行全局安装：$ npm install -g @google/gemini-cli安装后，只需在终端输入 gemini，首次运行会引导用户进行 Google 账户授权和主题选择，整个过程和 Claude Code 几乎没有区别，完成后进入交互模式：下面将从几个重要的维度对 Gemini CLI 和 Claude Code 的功能进行对比。代码理解与交互Gemini CLI 和 Claude Code 这两款工具都具备强大的代码理解能力，支持超长的上下文窗口，能够轻松应对大型项目。它们都允许用户通过 @ 符号引用文件和目录，并提供自动补全功能，使得与代码库的对话变得异常简单。Gemini CLI 在与代码交互时，更侧重于直接的问答和指令执行；Claude Code 则更进一步，它通过与 IDE 的深度集成，能够获取更丰富的上下文信息，例如当前打开的文件、光标选中的代码、甚至是 IDE 的诊断信息。这使得 Claude Code 在进行代码修复或重构时，能够提供更精准、更贴合当前开发场景的建议。上手第一个问题，必定是让它 “介绍下这个项目”：可以看到 Gemini CLI 也能很好的完成这个工作，不过相对于 Claude Code 感觉还是差点意思，缺少了中间读取文件的过程：内置工具与扩展性Gemini CLI 内置了一系列实用的工具，涵盖了文件查找 (FindFiles/ReadFolder)、内容搜索 (SearchText)、文件读取（ReadFile/ReadManyFiles）、文件编辑 (Edit)、文件创建 (WriteFile)、Shell 命令执行 (Shell) 、网页抓取 (WebFetch) 、联网搜索（GoogleSearch）和保存记忆（Save Memory）等常用功能。可以在交互模式下输入 /tools 斜杠命令查看：而 Claude Code 的内置工具集更为丰富和专业，多达 16 个。除了 Gemini CLI 包含的基础功能外，它还提供了：更精细的文件操作: MultiEdit 用于批量修改，NotebookRead/Edit 用于原生支持 Jupyter Notebook 操作；更高效的文件检索：Grep 工具通过 ripgrep 替代 grep 在检索大型代码库时效率更高；任务管理与规划: TodoWrite/Read 用于生成和跟踪任务列表，Task (子智能体) 用于执行深度搜索和研究，exit_plan_mode (规划模式) 用于在执行复杂任务前制定详细计划；Git/GitHub 集成: 内置了对 git 和 gh (GitHub CLI) 的深度支持，能够理解 PR、审查代码、处理评论等；关于 Claude Code 的这些功能，可以参考我之前的文章。尽管如此，Gemini CLI 提供的这些基础工具已经可以完成绝大多数工作了，其中，保存记忆（Save Memory） 是 Gemini CLI 的一个比较有特色的工具，我们可以通过自然语言让 Gemini CLI 记住我们的个人偏好或项目设置等信息：也可以通过斜杠命令 /memory add 手动添加：> /memory add "your fact here"添加的记忆内容将保存在用户目录下的 ~/.gemini/GEMINI.md 文件中，查看该文件的内容如下：$ cat ~/.gemini/GEMINI.md ## Gemini Added Memories - My best programming language is Python.后续对话时 Gemini CLI 会自动填充记忆内容。我们也可以在项目的根目录手动创建记忆文件，供整个…

将 Claude Code 集成到更多地方
type: item
date: 2025-07-08T06:29:00+00:00
description: 我们已经熟悉了在终端中与 Claude Code 进行会话，并了解了其强大的功能。为了进一步提升开发效率，本文将介绍如何将 Claude Code 无缝集成到我们日常使用的 IDE 和 GitHub 工作流中，使其成为开发过程中的得力助手。将 Claude Code 添加到 IDE 中Claude Code 可以无缝地集成到一些流行的 IDE 中，这样我们在使用 IDE 编码的同时也能享受 Claude Code 的功能。它目前支持两个主要的 IDE 系列：VS Code（包括 Cursor、Windsurf 等分支）和 JetBrains IDEs（包括 PyCharm、WebStorm、IntelliJ 和 GoLand）。我们以 VS Code 为例，它的安装非常简单，直接在集成终端中运行 claude 命令，即可自动安装扩展。注意 VS Code 版本必须是 1.98 以上。如果没有自动安装，我们也可以手动在应用商店中找到 Claude Code 扩展，点击安装即可：安装成功后，在 VS Code 右上角会显示一个 “Run Claude Code” 的按钮：吐槽一句，必须得随便打开一个文件才能看到这个按钮。点击这个按钮或使用 Cmd + Esc 快捷键，可以快速打开 Claude Code 交互界面；或者直接在集成终端中运行 claude 命令也可以自动连上 VS Code；甚至可以在任何外部终端中使用 claude --ide 和 /ide 命令也能连接到 VS Code。连接到 IDE 之后，我们可以享受下面这些功能：差异查看：代码更改可以直接在 IDE 中显示，而不是在终端中，代码差异更加直观；选择上下文：你在 IDE 中选择的文本和打开的文件会自动填充到 Claude Code 上下文中；文件引用快捷键：使用 Cmd + Option + K 插入文件引用（比如 @File#L1-99）；诊断共享：在 IDE 中出现的诊断错误会自动与 Claude Code 共享；在 IDE 中查看代码差异：在 Claude Code 引用选择的文本：让 Claude Code 操作 Github之前在学习 Bash 工具时，我们曾介绍过 Claude Code 是如何操作 Git 的。其实，当时还有一部分内容没讲，除了 Git 操作，Claude Code 还可以处理许多 GitHub 操作，我们今天补下这部分内容。开始之前，你需要提前安装 Github CLI 命令行工具：$ brew install gh然后登录你的 Github 账号：接下来就可以让 Claude Code 操作 Github 仓库了，比如：创建拉取请求（Pull Request）：自动查看你的更改和最近历史，生成符合上下文的提交消息，并使用 gh pr create 创建 PR；代码审查（Code Review）：对用户提交的 PR 进行审查，提出优化或修复建议；处理代码审查（Code Review）评论：根据 PR 上的评论来修复问题，并在完成后推送回 PR 分支；修复构建失败或 linter 警告：根据构建报错信息或 linter 警告来修复问题；分类和筛选未解决的问题：让 Claude 循环处理未解决的 GitHub Issues；创建拉取请求（Pull Request）和 Git 提交一样，Claude Code 会自动查看你的更改和最近历史，生成符合上下文的提交消息；Claude 理解 PR 简写，所以可以直接这样说：在 Bash 的工具描述中，有一份创建 PR 的规范，可以对照着上面的截图，了解下 Claude Code 是如何创建 PR 的：对于所有 GitHub 相关任务，包括处理 issues、拉取请求、检查和发布，请使用 Bash 工具通过 gh 命令。 如果给出了 GitHub URL，请使用 gh 命令获取所需信息。 重要提示：当用户要求您创建拉取请求时，请仔细遵循以下步骤： 1. 始终使用 Bash 工具并行运行以下 bash 命令，以了解分支自从与主分支分离以来的当前状态： - 运行 git status 查看所有未跟踪的文件 - 运行 git diff 查看将要提交的已暂存和未暂存更改 - 检查当前分支是否跟踪远程分支并与远程保持最新，这样你就知道是否需要推送到远程 - 运行 git log 命令和 `git diff [base-branch]...HEAD` 来了解当前分支的完整提交历史（从它与基础分支分离的时间开始） 2. 分析将包含在拉取请求中的所有更改，确保查看所有相关提交（不仅仅是最新提交，而是将包含在拉取请求中的所有提交！！！），并起草拉取请求摘要 3. 始终并行运行以下命令： - 如果需要，创建新分支 …

给 Claude Code 的工具加上钩子
type: item
date: 2025-07-07T06:26:00+00:00
description: 就在前几天，Claude Code 发布了 v1.0.38 版本，推出了一项有趣的功能：钩子（Hooks），它允许用户注册自己的 Shell 脚本，在 Claude Code 生命周期的各个阶段执行，以此来自定义和扩展 Claude Code 的行为。我们上周刚学习了 Claude Code 的权限控制机制，它为工具的调用提供了全方位的安全保障，现在有了钩子机制，我们可以实现更加个性化的控制。当然，除了权限控制，钩子的想象空间还是很大的，以下是一些示例用例：通知：当 Claude Code 等待用户确认时，可以用钩子自定义通知用户的方式自动格式化：每次编辑文件后，对文件进行格式化，比如对 .ts 文件运行 prettier，对 .go 文件运行 gofmt 等日志记录：跟踪和统计所有执行的命令，以满足合规性或调试需求反馈：当 Claude Code 生成的代码不符合代码库规范时，提供自动反馈自定义权限：对工具调用实现更加个性化的权限控制，比如阻止对生产文件或敏感目录的修改钩子配置钩子配置和权限配置一样，保存在配置文件里，该配置文件可以放在下面这些位置：用户设置（~/.claude/settings.json）：用户私有，适用于所有项目共享项目设置（.claude/settings.json）：提交到 Git 仓库，团队成员共用本地项目设置（.claude/settings.local.json）：不提交到 Git 仓库，用户私有，只适用于当前项目企业管理策略（/path/to/policies.json）：在企业环境下，系统管理员可以强制执行用户无法覆盖的安全策略，优先级最高钩子配置的结构如下：{ "hooks": { "EventName": [ { "matcher": "ToolPattern", "hooks": [ { "type": "command", "command": "your-command-here" } ] } ] } }其中 EventName 表示事件名称，Claude Code 目前支持下面这些钩子事件：PreToolUse - 在 Claude Code 生成工具参数后、执行工具调用前运行PostToolUse - 在 Claude Code 执行工具调用成功结束后运行Notification - 在 Claude Code 发送通知时运行Stop - 在主 Claude Code 完成响应时运行SubagentStop - 在 Claude Code 子智能体完成响应时运行（也就是 Task 工具调用）下面的 matcher 叫做匹配器，表示匹配工具名称的模式。它可以是简单的字符串完全匹配，比如 Write 仅匹配 Write 工具；也可以是正则表达式，比如 Edit|Write 或 Notebook.*；如果省略或为空字符串，钩子将匹配所有工具；注意这个参数仅适用于 PreToolUse 和 PostToolUse 事件。匹配器也支持匹配 MCP 工具，MCP 工具名称遵循 mcp__<server>__<tool> 格式。匹配器可以完全匹配，如 mcp__filesystem__read_file；也可以正则匹配，如 mcp__memory__.* 或 mcp__.*__write.* 等。每个匹配器可以配多个钩子，每个钩子支持三个配置参数：type：当前仅支持 "command" 类型command：要运行的 Bash 命令，运行环境为 Claude Code 所在目录，如果匹配多个钩子，所有钩子并行运行timeout：（可选）命令运行超时时间，以秒为单位，默认 60 秒；只要有一个命令运行超时，所有进行中的钩子都会被取消你的第一个钩子这是官方文档中展示的一个钩子示例：{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt" } ] } ] } }请提前安装用于 JSON 处理的 jq 命令。这个示例用于记录 Claude Code 运行的 Shell 命令，它创建了一个监听 PreToolUse 事件的钩子，在调用 Bash 工具之前，先运行 jq -r ... 这串命令。这个 jq -r ... 命令从 STDIO 读取一个 JSON 数据，将 Bash 要执行的命令 .tool_input.command 和…

管理 Claude Code 的工具权限
type: item
date: 2025-07-04T00:36:00+00:00
description: 我们知道，Claude Code 内置了 16 个强大的工具，加上我们昨天学习的 MCP 服务器，用户可以轻松集成更多的外部工具。通过合理调度这些工具，Claude Code 能够很好地对你的代码库进行理解和修改。但是这些工具中，不乏有一些是比较危险的，比如 Bash 可能执行任意的命令，Edit 可能篡改你的文件，外部工具可能存在安全风险，对此，Claude Code 提供了一套完善的权限控制机制。上图列出了 Claude Code 内置工具的默认权限，对于 Bash 或 Edit 这种修改类的工具，必须等待用户确认后才开始执行。修改工具的默认权限当然，工具的权限并不是一成不变的，可以通过 --allowedTools 或 --disallowedTools 参数修改工具的默认权限：$ claude --allowedTools "Edit,MultiEdit,Write"通过上面的方式启动 Claude Code 后，在编辑或写入文件时，不再需要用户批准，将会直接执行。$ claude --disallowedTools "WebSearch,WebFetch"通过上面的方式启动 Claude Code 后，将会禁用联网搜索和网页抓取工具。注意，--allowedTools 是将工具的权限从用户确认改成自动放行，而 --disallowedTools 是将工具直接从工具列表中移除。貌似不能将工具的权限从自动放行改成用户确认。这两个参数都可以在会话过程中通过 /permissions 或 /allowed-tools 斜杠命令进行查看和修改：允许和禁止的工具分别位于 Allow 和 Deny 页签下，如果某个工具既配了拒绝规则又配了允许规则，拒绝规则优先于允许规则。额外的工作目录默认情况下，Claude Code 只允许访问当前工作目录下的文件，在访问工作目录外的文件时，也会要求用户确认：我们可以在启动时通过 --add-dir 参数添加额外的工作目录：$ claude --add-dir ../browser-use或者在会话中使用 /add-dir 斜杠命令：> /add-dir ../browser-use这个参数也可以在会话过程中通过 /permissions 或 /allowed-tools 斜杠命令进行查看和修改：所有允许访问的目录均显示在 Workspace 页签下，额外的工作目录遵循和原始工作目录相同的权限规则：读取文件无需确认，编辑文件则根据当前的权限模式决定是否确认。更细粒度的权限控制在调用某些工具时，我们可能还需要有更细粒度的权限控制，比如可以允许 Bash 执行特定命令，拒绝 Read 读取某些文件，等等，Claude Code 支持在工具名后面加上特定的匹配规则，比如下面这个例子：$ claude --allowedTools "Bash(npm run build)"当使用 Bash 工具运行 npm run build 命令时，直接放行，无需用户确认。也可以在匹配规则中使用通配符：$ claude --disallowedTools "Bash(git:*)"当使用 Bash 工具运行以 git 开头的命令时，直接拒绝：Claude Code 能很好的处理 Shell 操作符（比如 &&），因此像 Bash(safe-cmd:*) 这样的前缀匹配规则不会给它运行命令 safe-cmd && other-cmd 的权限。另外，Read 和 Edit 也有一套自己的匹配规则，比如：$ claude --allowedTools "Edit(docs/**)"上面的命令允许对项目 docs 目录中文件进行编辑，其中的 docs/** 规则 遵循 gitignore 规范。还可以使用 // 引用绝对路径，或者 ~/ 引用用户目录的路径：Edit(//tmp/scratch.txt) 匹配对 /tmp/scratch.txt 的编辑Read(~/.zshrc) 匹配对用户的 ~/.zshrc 文件的读取值得注意的是，Read 的规则将应用于所有读取文件的内置工具，如 Grep、Glob 和 LS。除了命令执行和文件操作，下面这些工具也支持细粒度控制：WebFetch(domain:example.com) 匹配对 example.com 的抓取请求mcp__amap 匹配由 MCP 服务器 amap 提供的任何工具mcp__amap__weather 匹配由 MCP 服务器 amap 提供的 weather 工具权限模式Claude Code 支持几种不同的权限模式：默认模式（default）：按照默认或用户配置的权限规则对工具进行验证自动编辑模式（acceptEdits）：自动接受对工作目录下的文件的编…

使用 MCP 让 Claude Code 集成外部工具
type: item
date: 2025-07-03T00:32:00+00:00
description: MCP（Model Context Protocol，模型上下文协议）) 是 Anthropic 于 2024 年 11 月 25 日 推出的开放协议，用于标准化大模型与各类外部工具和数据源之间的交互。Claude Code 作为自家的 AI 编程工具，自然也支持 MCP 协议。除了内置的 16 个工具，用户可以使用 MCP 无缝集成任意数量的自定义工具和外部数据源，从而进一步拓展 Claude Code 的能力边界。MCP 简介下面这张图非常形象地展示了 MCP 的基本架构：可以看到 MCP 采用了非常经典的 C/S 架构（客户端/服务器），主要包括三个部分：主机（Host）： 一般是基于大模型的 AI 应用，比如 Claude Desktop、ChatGPT Desktop、Cursor 等桌面应用，需要访问外部数据或工具；客户端（Client）：内置在应用中，与 MCP 服务器建立一对一的连接；服务器（Server）：连接本地数据源或远程服务，提供特定功能；本地数据源：文件或数据库；远程服务：外部 API 或互联网服务；MCP 协议将所有的外部数据或工具以一种统一的方式接入 AI 应用，这就好比 USB-C 接口，将各种不同的电子设备统一成一种接口，从而让用户不再为准备各种各样不同的线缆插头而烦恼。简单说，MCP 就像一座桥梁，它本身不处理复杂逻辑，只负责协调 AI 应用与外部资源之间的信息流动。在推出 MCP 之前，AI 应用如果要对接外部工具，通常需要单独整合多个不同的 API，每个 API 的接口可能都各不相同，认证方式和错误处理也可能不同，极大地增加了开发复杂度和维护成本。所以说，传统 API 就像不同的门，每扇门都有一把不同的钥匙，而 MCP 像一把万能钥匙，AI 应用开发者只要集成了这个万能钥匙，就可以打开任意的门。下面是 MCP 和传统 API 的对比：有关 MCP 的更多信息，请参阅 MCP 文档：https://modelcontextprotocol.io/introduction添加 MCP 服务器在之前的文章中我们曾遇到过 WebFetch 工具调用报错的问题，我们可以将其换成 Fetch MCP Server。通过 claude mcp add 命令添加 MCP 服务器：$ claude mcp add web-fetch -- uvx mcp-server-fetch上面的 web-fetch 是我们自定义的 MCP 工具名称，-- 后面的内容是 MCP 服务器的启动命令。添加成功之后，进入 Claude Code 交互模式，输入 /mcp 可查看 MCP 服务器的状态：如果状态显示 connected，则说明 MCP 服务器已就绪。可以按下 Enter 键查看 MCP 工具的详细信息：此时就可以使用该工具了，比如对网页内容进行问答或总结：默认情况下，所有的 MCP 工具都需要经过用户确认后才可以运行，同意运行后结果如下：如果感兴趣的话，可以拿 Wireshark 对 Claude Code 进行抓包，可以发现请求的 tools 里多了一个工具 mcp__web-fetch__fetch，工具的名称、描述、参数和上面的工具详情是一样的：添加 HTTP/SSE 模式的 MCP 服务器上面的 Fetch MCP Server 是 STDIO 模式的 MCP 服务器，这也是最常见的 MCP 服务器连接方式。当运行 claude mcp add 命令时，默认就是 STDIO 模式，我们也可以通过 --transport 或 -t 参数添加 HTTP 或 SSE 模式的 MCP 服务器。下面以 高德地图 为例，演示下如何在 Claude Code 中调用 HTTP 或 SSE 模式的 MCP 服务器。首先，我们需要注册并登录 高德开放平台，然后创建一个应用得到 Key，之后运行下面的命令添加 MCP 服务器：$ claude mcp add --transport http amap "https://mcp.amap.com/mcp?key=<your-api-key>"高德地址也支持 SSE 模式：$ claude mcp add --transport sse amap "https://mcp.amap.com/sse?key=<your-api-key>"高德地图的 MCP 服务器包含十几个工具，包括导航、定位、打车、路径规划、周边搜索、天气查询等，非常实用：设置环境变量有些 MCP 服务器依赖于额外的环境变量，比如设置 API 密钥，我们可以通过 --env 或 -e 参数来配置。下面以 Brave Search MCP Server 为例，将内置的 WebSearch 工具替换成 Brav…

学习 Claude Code 的工具使用（三）
type: item
date: 2025-07-02T00:31:00+00:00
description: 经过前两天的学习，我们已经掌握了 Claude Code 的命令执行、文件查找、文件读写、网络检索相关的工具，目前还剩下 Task、TodoWrite、TodoRead 和 exit_plan_mode 四个工具，今天就来学习下它们。这四个工具都是 Claude Code 用来解决复杂任务的，它们也代表着大模型在解决复杂任务时的几种不同的思路。代办列表代办列表（Todo List） 是一种组织复杂任务并跟踪处理进度的常用手段，Claude Code 在面对复杂的多步骤任务时，会使用代办列表将其分解成多个子项，然后按顺序依次处理：和代办列表相关的工具有两个：TodoRead - 读取当前会话的代办列表TodoWrite - 创建和管理结构化的代办列表在 TodoRead 工具的描述中提到，Claude Code 应该主动且频繁地使用该工具，以了解当前代办列表的状态，确保一直处在正确的轨道上，特别是以下情况：在对话开始时查看待处理的事项在开始新任务之前优先安排工作当用户询问之前的任务或计划时当你不确定下一步该做什么时完成任务后更新你对剩余工作的理解每隔几条消息后确保你在正确的轨道上不过我测试下来发现很少触发 TodoRead 的调用，一直使用 TodoWrite 就足够完成整个任务，可能是我的任务都比较简单吧。但是我感觉 TodoRead 确实比较鸡肋，因为大模型在每次调用 TodoWrite 的时候，代办列表会反复出现在上下文中，还需要 TodoRead 再去查一次吗？相对来说，TodoWrite 的使用场景就明确的多，比如下面这些情况：复杂的多步骤任务 - 当任务需要3个或更多不同的步骤时不易解决的棘手任务 - 需要仔细规划或多项操作的任务用户明确请求待办列表 - 当用户直接要求你使用待办列表时用户提供多个任务 - 当用户提供需要完成的事项列表时（编号或逗号分隔）代办列表中的每个待办事项有三种状态：pending - 任务尚未开始in_progress - 当前正在处理completed - 任务成功完成在任务处理的不同阶段实时地更新待办事项的状态：收到新指令后 - 立即将用户需求记录为待办事项开始处理任务时 - 在开始工作之前将其标记为进行中，应该只有一个待办事项处于进行中状态完成任务后 - 将其标记为已完成，并添加在实施过程中发现的任何新后续任务如果遇到错误、阻碍或无法完成 - 保持待办事项为 in_progress 状态，或者创建一个新的待办事项描述需要解决的问题在 TodoWrite 工具的描述中还给出了几个使用示例，供大家参考。示例一：用户：我想在应用程序设置中添加一个深色模式切换功能，完成后确保运行测试和构建！ 助手：我将帮你在应用程序设置中添加深色模式切换功能，让我创建一个待办列表来跟踪这个实现。 *创建包含以下项目的待办列表：* 1. 在设置页面创建深色模式切换组件 2. 添加深色模式状态管理（上下文/存储） 3. 为深色主题实现 CSS-in-JS 样式 4. 更新现有组件以支持主题切换 5. 运行测试和构建过程，解决发生的任何失败或错误 *开始处理第一个任务*示例二：用户：帮我在项目中将函数 getCwd 重命名为 getCurrentWorkingDirectory 助手：让我先搜索你的代码库以找到所有 getCwd 的出现位置。 *使用grep或搜索工具定位代码库中getCwd的所有实例* 助手：我在 8 个不同文件中找到了 15 个 getCwd 实例，让我创建一个待办列表来跟踪这些更改。 *为每个需要更新的文件创建包含具体项目的待办列表*示例三：用户：我需要为我的电商网站实现这些功能：用户注册、产品目录、购物车和结账流程。 助手：我将帮助实现这些功能。首先，让我们将所有功能添加到待办列表中。 *创建一个待办列表，基于项目架构将每个功能分解为具体任务* 助手：让我们从用户注册开始。这将涉及创建数据库模型、API端点和与你现有认证系统集成的前端表单。示例四：用户：你能帮助优化我的 React 应用程序吗？它渲染很慢，有性能问题。 助手：我将帮助优化你的 React 应用程序。首先，让我检查你的代码库以识别潜在的性能瓶颈。 *审查组件结构、渲染模式、状态管理和数据获取* 助手：在分析你的代码库后，我识别出了几个性能问题。让我创建一个待办列表来跟踪我们的优化工作。 *创建包含以下项目的待办列表： 1) 为 ProductList 中的昂贵计算实现缓存， 2) 为 Dashboard 中的长列表添加虚拟化， 3) 优化 Gallery 组件中的图像加载， 4) 修复 ShoppingCart 中的状态更新循环， 5) 审查包大小并实现代码分割* 让我们从为 ProductList 组件中的昂贵计算实现缓存开始…

学习 Claude Code 的工具使用（二）
type: item
date: 2025-07-01T00:28:00+00:00
description: 在上一篇中，我们学习了 Claude Code 的 Bash、LS、Glob 和 Grep 四个工具，用于命令执行和文件查找相关的任务，我们今天继续看下其他的工具。文件读写文件读取和文件写入应该是 Claude Code 最常做的事情了，我们在之前的学习中不止一次使用了这些工具。比如运行 /init 命令生成 CLAUDE.md 文件时，就是通过 Read 去读取文件内容，然后再用 Write 去写入新文件：Claude Code 推荐使用 Read 工具去读取文件，而不是 cat 、 head 或 tail 等 Bash 命令，这是因为 Read 相对于这些命令来说有几个独特的优势，我们可以从 Read 的工具描述中看到：默认情况下，最多读取 2000 行可以指定行偏移量和限制，对于长文件特别有用任何超过 2000 个字符的行都会被截断结果使用 cat -n 格式返回，行号从 1 开始，便于大模型了解代码所在的行数支持读取图像（如 PNG、JPG 等）其中最大的优势是读取图像，因为 Claude Code 是一个多模态大模型，所以我们可以让 Claude 去分析错误截图或者按产品原型图去开发页面，比如这里将百度首页截图：然后将它丢给 Claude Code 去仿照：Claude Code 首先调用 Read 去读取图片，将其转换成 BASE64 格式，然后去调用 Claude 的视觉能力：{ "model": "claude-sonnet-4-20250514", "messages": [ { "role": "user", "content": [ { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgoAAAANSUhEUgAABx..." } }, { "type": "text", "text": "仿照 demo.png 文件写一个静态 html 文件" } ] } ], "temperature": 1, "max_tokens": 32000, "stream": true }最终生成静态页面如下：文件编辑还有很多任务需要对代码文件进行编辑修改，这是通过 Edit 和 MultiEdit 两个工具实现的。这两个工具的本质是字符串替换，可以从工具的描述和 Schema 看出来：{ "name": "Edit", "description": "Performs exact string replacements in files...", "input_schema": { "type": "object", "properties": { "file_path": { "type": "string", "description": "The absolute path to the file to modify" }, "old_string": { "type": "string", "description": "The text to replace" }, "new_string": { "type": "string", "description": "The text to replace it with (must be different from old_string)" }, "replace_all": { "type": "boolean", "default": false, "description": "Replace all occurences of old_string (default false)" } }, "required": [ "file_path", "old_string", "new_string" ], "additionalProperties": false, "$schema": "http://json-schema.org/draft-07/schema#" } }这个工具有四个参数：file_path - 文件全路径old_string - 替换前的原字符串new_string - 替换后的新字符串replace_all - 是否全部替换，默认 false当调用 Edit 工具时，原字符串和新字符串会以 diff 形式显示出来：在调用 Edit 工具之前，必须先至少调用一次 Read 工具，方便 Claude Code 获得原字符串，Edit 工具一次只能替换一个字符串，如果要批量替换多个字符串，可以使用 MultiEdit 工具。Notebook 读写Claude Code 内置了对 Jupyter N…

学习 Claude Code 的工具使用
type: item
date: 2025-06-30T00:24:00+00:00
description: 在前面的学习中我们已经接触了不少 Claude Code 的工具，比如使用 List 工具列出文件列表，使用 Read 和 Write 工具对文件进行读写，使用 Bash 工具调用 git add 或 git commit 等命令。Claude Code 内置了不少工具，但是由于 Claude Code 并没有开源，除了官方文档，我们并没有太多工具相关的资料可参考。因此我使用 Wireshark 对 Claude Code 的请求抓包分析，看到了它内置的提示词以及 tools 参数：从上图可以看到，Claude Code 内置了 16 个工具，这些工具大致可以分为下面几类：分类分类描述示例工具命令执行允许在 Shell 会话中执行 Bash 命令Bash文件查找用于快速查找并匹配文件LS、Glob 和 Grep文件读写用于读取或写入文件，允许进行文件编辑和内容替换Read、Write、Edit 和 MultiEditNotebook 读写用于读取和编辑 Jupyter Notebook（也就是 .ipynb 文件）NotebookRead 和 NotebookEditWeb 检索用于检索和分析 Web 内容的工具WebFetch 和 WebSearch复杂任务处理通过子智能体或任务清单来执行复杂任务Task、TodoWrite、TodoRead 和 exit_plan_mode今天就来仔细学习一下这些工具。Bash 执行命令Claude Code 是一款基于终端的 AI 编程助手，它继承了你的 Shell 环境，可以调用常用的 Unix 命令。比如调用 du 查看文件夹大小：调用 zip 压缩文件夹：甚至可以使用你安装的任何命令行工具，比如我们之前学过 PDFMathTranslate 这款开源的 PDF 文档翻译工具，让 Claude Code 来试试：当然，默认情况下 Claude Code 并不知道这些命令，可以通过在 CLAUDE.md 中记录常用的命令，告诉 Claude 可以使用哪些命令以及每个命令的用法：你可以使用下面这些 Bash 命令： * pdf2zh - 一款免费开源的 PDF 文档翻译工具，支持多种语言和翻译服务，最大的特色是翻译后保持排版不变。 基本用法，默认将英文 PDF 文件翻译成中文：`pdf2zh example.pdf` 指定源和目标语言：`pdf2zh example.pdf -li en -lo ja` 查看命令文档：`pdf2zh --help`Bash 命令几乎可以实现任何功能，但是不同的 Bash 命令参数迥异，有些命令的参数还特别复杂，为了防止大模型生成命令时误入歧途，Claude Code 内置了一些工具来替代常见的 Unix 命令。从抓包请求里可以看到 Bash 工具的描述，其中有几个点比较有意思：含空格的路径必须用双引号包裹严禁使用 find 和 grep 搜索命令，改用 Grep / Glob / Task 工具避免使用 cat / head / tail / ls 等读取工具，改用 Read / LS 工具如果你仍然要运行 grep，请停止，必须优先使用预装的 rg 来替代，所有 Claude Code 用户都已预安装此工具尽量使用绝对路径，避免使用 cd，除非用户明确要求这样做的好处是，大模型通过 function call 生成结构化的命令，比直接生成长长的命令行要可控的多。LS 列出文件和目录从 Bash 的工具描述中可以看到，Claude Code 使用内置的 LS 工具替代 ls 命令：内置 LS 的好处是它可以递归遍历子目录，如上图所示（使用 Ctrl + R 可以展开详情）。Glob 根据文件名查找文件另一个内置的 Glob 工具用于替代 find 命令，可以基于模式匹配来查找文件：它有点类似下面这个 find 命令：$ find . -type f -name "*global*"但比 find 命令强的地方在于它支持 Glob 模式匹配，比如 **/*.js 或 src/**/*.ts 这样。尽管在 Bash 的工具描述里特别提到 严禁使用 find 命令，但是我验证下来发现，如果内置的工具不足以完成用户的任务，Claude Code 还是会使用这些被限制的命令：Grep 搜索文件内容另外，从 Bash 的工具描述中我们还得知，Claude Code 预装了一个叫 rg 的工具用于替代 grep 命令，这个 rg 全名叫 ripgrep，是一个现代的命令行搜索工具，相对于 grep 来说搜索效率更高。可以在 Claude Code 的安装目录下找到它：@anthropic-ai/claude-code/vendor/ripgrepripgrep 使用 …

学习 Claude Code 的命令行操作
type: item
date: 2025-06-27T09:38:00+00:00
description: 我们昨天学习了 Claude Code 的一些实用技巧，包括提问的艺术、图像的处理，文件和网址的处理、扩展思考模式等，还介绍了几个会话管理的小命令，Claude Code 还有不少实用的命令和参数，我们今天来盘点下。使用 claude --help 查看 Claude Code 支持的所有命令和参数：非交互模式参数 -p 或 --print 可以让 Claude Code 直接打印响应，不进入交互模式，这对于脚本编写和自动化特别有用。比如下面的例子让 Claude Code 充当一个代码检查工具：$ claude -p "你是一个代码检查工具，请检查主分支的更改，并报告任何与拼写错误相关的问题。报告分两行：第一行是文件名和行号，第二行描述问题。不要返回任何其他文本。"非交互模式可以让我们很方便地将 Claude Code 无缝地集成到构建脚本或 CI/CD 工作流中。假如你在开发 Node.js 项目，可以将这个命令添加到 package.json 文件：{ ... "scripts": { ... "lint:claude": "claude -p '你是一个代码检查工具...'" } }然后运行 npm run lint:claude 来对提交的代码进行检查：除了代码检查，你可以自定义提示词实现更多其他功能。为了防止非交互模式下 Claude Code 陷入死循环，可以使用 --max-turns 参数限制对话的轮数：$ claude -p --max-turns 3 "query"非交互模式还可以让我们使用管道将 Claude Code 集成到现有的 Shell 脚本中，与其他 Unix 工具结合使用以实现强大的工作流程：$ cat build-error.txt | claude -p '详细解释这个构建错误并分析可能的出错原因' > output.txt默认 Claude Code 的输出为纯文本方式，可以考虑使用 —output-format 参数进行结构化输出：$ cat package.json | claude -p '找出这个文件中可能存在的问题' --output-format=json > output.json这种输出结构方便我们以编程方式解析 Claude 的响应，输出内容包含状态、结果、耗时、使用的 tokens 等元数据，如下：{ "type": "result", "subtype": "success", "is_error": false, "duration_ms": 14340, "duration_api_ms": 17037, "num_turns": 3, "result": "这个 package.json 文件有以下问题：...", "session_id": "ecb8aaf4-4fbe-44c1-a27a-c88f5d85f817", "total_cost_usd": 0.06880885, "usage": { "input_tokens": 9, "cache_creation_input_tokens": 15601, "cache_read_input_tokens": 14445, "output_tokens": 289, "server_tool_use": { "web_search_requests": 0 }, "service_tier": "standard" } }Claude Code 支持 JSON 和流式 JSON 两种结构化输出格式，当使用流式 JSON 时，Claude Code 会实时输出一系列的 JSON 对象，而不是一个 JSON 对象。可以根据需要来选择不同的输出格式：对于只需要 Claude 响应的简单集成，使用 --output-format=text当你需要完整的对话日志时，使用 --output-format=json当你需要每个对话轮次的实时输出时，使用 --output-format=stream-json我们除了可以控制输出格式，也可以使用 --input-format 参数指定输入格式，Claude Code 支持两种输入格式：对于简单集成，使用 --input-format=text当你需要实时流式输入时，使用 --input-format=stream-json调试模式参数 -d 或 --debug 用于开启调试模式：$ claude --debug调试模式右下角会显示 “Debug mode” 的标记，在交互过程中会打印出 Claude Code 中 DEBUG 级别的日志：参数 --verbose 用于开启详细模式，或者叫做冗余模式：$ claude --verbose详细模式下会显示出工具的完整调用结…

学习 Claude Code 的基本技巧
type: item
date: 2025-06-26T09:35:00+00:00
description: 昨天我们折腾了一下 LiteLLM 网关，成功让 Claude Code 接入了其他大模型。这下好了，直接用 OpenRouter 的免费 DeepSeek 模型，再也不用担心 API 费用把钱包掏空了，可以放心大胆地体验 Claude Code 的各种功能。前面我们已经学习了 Claude Code 的安装和基本用法，今天咱们继续深入挖掘一些实用的小技巧，让这个工具用起来更顺手。提问的艺术用 Claude Code 就像跟人聊天一样，你说话越清楚，它就越能帮到你。下面是几个建议：第一，指令越具体越好，比如当你的页面出 BUG 时，不要这样问：> 修复这个 BUG这样问才对：> 修复登录页面的 BUG，用户输错密码后看到的是空白页面而不是错误提示第一种问法就像对着服务员喊"给我来个菜"，第二种才是正常人的沟通方式。第二，大任务拆成小步骤，复杂的需求别一股脑全说出来，要学会拆解：> 1. 给用户资料页面加个新的 API 接口 > 2. 添加必填字段的验证逻辑 > 3. 写几个测试用例验证功能分步解决可以让 Claude Code 更了解用户的意图。第三，让 Claude Code 先摸清状况，别上来就让它动手改代码，先让它了解一下你的项目：> 帮我分析一下这个数据库的表结构 > 这个数据库查询异常是怎么回事？使用扩展思考模式以往的大语言模型，要么擅长快速响应，要么擅长深度推理，很难兼顾两者，比如 DeepSeek 的 V3 和 R1。Claude Sonnet 3.7 号称是业界首个 混合推理（Hybrid Reasoning） 模型，同时支持 标准模式 与 扩展思考模式：标准模式：对于一些事实性问题或简单指令，能迅速给出答案，快速回复用户；扩展思考模式（Extended Thinking）：模型会在回答之前进行自我反思，进行更深入的思考，并给出更全面、更准确的答案；所有在 Claude Sonnet 3.7 之后发布的 Opus 和 Sonnet 模型都支持这两种模式。当我们面对下面这些复杂的任务时可以尝试使用扩展思考：规划复杂的架构更改调试复杂问题为新功能创建实现计划理解复杂的代码库评估不同方法之间的权衡Claude 官方出了一份关于扩展思考的高级策略和技巧指南，推荐阅读：https://docs.anthropic.com/zh-CN/docs/build-with-claude/prompt-engineering/extended-thinking-tips我们在 Claude Code 中对话时，默认使用的是标准模式；如果要处理上面那些复杂的问题时，可以在指令中加上 “think” 或 “think harder” 等触发扩展思考模式：> 我需要实现 OAuth2 认证，深入思考最佳方法 > 思考下，这种方法可能存在哪些潜在的安全漏洞？ > 更深入地思考我们应该处理的边缘情况我试了下，无论是英文 “think” 还是中文 “思考” 都可以触发扩展思考模式，而且可以使用类似 “think more”、“think a lot”、“think harder” 或 “think longer” 这样的强化短语触发更深层的思考。Claude 的思考模式可以通过 budget_tokens 参数控制令牌预算，我猜测不同的提问方式会导致这个参数的值不同，更深层的思考消耗更多的思考令牌，感兴趣的朋友可以验证一下。我这里还是拿数独项目为例，让它给我提一些 SEO 优化的建议：和 DeepSeek R1 一样，Claude 的思考过程对用户也是可见的。在上图中，Claude 以斜体灰色文本显示了其思考过程，你可以看到它是如何一步步分析问题、得出结论的。Claude Code 对我的代码经过一番分析，最终输出如下：经过思考后的输出要更详细。处理图像Claude 系列模型具有视觉能力，可以理解和分析图像。当我们遇到有些问题用文本描述不清或过于繁琐时，可以给 Claude 提供图像，效果会更好，比如错误截图、UI 设计或图表等，图像比文本包含更多的上下文信息。我们可以通过下面几种方法向 Claude Code 对话中添加图像：将图像拖放到 Claude Code 窗口中复制图像并使用 ctrl+v 粘贴到命令行中（不要使用 cmd+v）提供图像路径，例如：“分析图像: /path/to/your/image.png”可以在对话中一次性添加多个图像。下面是使用图像的一些常用场景：让 Claude 分析图像> 这张图片显示了什么？ > 描述截图中的用户界面元素 > 这张图中是否有任何问题元素？使用图像提供上下文> 这是错误的截图，分析是什么原因引起的？ > 这是我们当前的数据库模式，为了实现新增的功能，我们应该如何修改它？从视觉内容获取代码建议…