008:使用 MCP 服务器扩展 Claude Code

008:使用 MCP 服务器扩展 Claude Code在本节课中 我们将要学习 Claude Code 官方教程的概述 了解课程的整体结构和学习目标 大家好 我是 Stephen Grder Anthropic 的技术团队成员 在这门课程中 我们将帮助大家快速掌握 Claude Code 在深入任何技术细节之前 我想先简要概述一下我们将要学习的内容 这门课程分为四个部分 我们将首先花一些时间来准确理解什么是编码助手 接着

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



在本节课中,我们将要学习 Claude-Code 官方教程的概述,了解课程的整体结构和学习目标。

大家好,我是 Stephen Grder,Anthropic 的技术团队成员。

在这门课程中,我们将帮助大家快速掌握 Claude-Code。

在深入任何技术细节之前,我想先简要概述一下我们将要学习的内容。

这门课程分为四个部分。我们将首先花一些时间来准确理解什么是编码助手。

接着,我们将深入了解 Claude-Code 本身,并理解它如何在市场上众多不同的编码助手中脱颖而出。

在明确了这些概念之后,我们将通过一个典型项目来演练 Claude-Code 的使用,并获得一些实践经验。

最后,我们将通过了解如何在您自己的项目中充分利用 Claude-Code 来结束课程。

本节课中我们一起学习了 Claude-Code 官方教程的课程介绍,明确了课程分为四个主要部分:理解编码助手、认识 Claude-Code 的独特之处、进行实践演练以及学习如何将其应用于个人项目。

在本节课中,我们将深入理解什么是编程助手。我们将探讨其背后的工作原理,以及为何Claude Code能成为一个出色的团队辅助工具。

编程助手是一种编写代码的工具。但要真正理解其价值,我们需要了解其幕后的运作机制。理解编程助手的实际功能和运作方式,能让你更好地认识到什么才是真正出色的、能补充团队能力的助手。

以下是理解编程助手工作方式的一种视角。

编程助手首先会收到一个任务。例如,助手可能需要根据某个错误信息来修复一个Bug。这个任务会被内部传递给一个语言模型,该模型需要找出解决问题的方法。

不同的语言模型以非常不同的风格解决问题,这取决于任务的复杂性。但在许多情况下,它们的工作方式与人类非常相似。

以下是编程助手执行任务时可能遵循的步骤:

  1. 收集上下文:首先,它需要理解错误信息指的是什么、代码库中哪个区域出现了错误,以及哪些文件看起来是相关的。
  2. 制定计划:在收集了信息之后,它需要制定一个计划,说明将如何实际完成任务。
  3. 采取行动:最后,它将采取行动。在这个例子中,它可能决定修改一些代码,然后运行或编写一个测试来验证问题是否真的被修复了。

我想为你提供更多关于这个完整过程的信息。特别需要注意的是,上述流程的第一步和最后一步要求编程助手实际一些事情。换句话说,它需要从外部世界收集信息,或者以某种方式影响外部世界。

  • 为了收集上下文,助手可能需要读取一个文件或从网上获取一些文档。
  • 为了采取行动,助手可能需要实际运行一个命令或编辑一个文件。

然而,让一个语言模型实际做这些事情,比听起来要复杂一些。让我帮你理解其中的原因。

让我们想象一下,我们正在直接与一个语言模型交互。也就是说,它没有在任何编程助手或类似工具中运行。

接着,想象我们直接问这个语言模型:main.go 文件里写了什么代码?在任何编程助手或类似工具的上下文之外运行的语言模型,本身并不具备读取文件、运行命令等能力。

语言模型接收文本内容,并返回文本。这就是它们全部的能力范围。所有语言模型都是如此。

所以,如果你向一个普通的语言模型发送一些文本,要求它读取一个文件,它很可能会回答说它没有读取文件的能力。

那么,让我展示一下编程助手以及许多其他工具是如何让一个语言模型能够“读取”文件的。

以下是具体过程。每当你向编程助手发送一个请求时,编程助手在幕后会自动在你的请求中附加大量文本。

在这个特定情况下,我们可以想象编程助手会添加一些文本,内容大致是:“如果你(语言模型)想读取一个文件,请用这种非常精心设计的格式来回复。”例如,格式可能是:read file: [文件名]

因此,在这种情况下,语言模型会意识到,为了回答我们的问题,它需要通过读取该文件来回应。所以它可能会回复:read file: main.go

然后,编程助手将负责接收这条精心设计的消息,并理解语言模型希望通过读取文件来采取某种行动。接着,编程助手将负责实际读取该文件,并将文件内容发送回语言模型。

现在,语言模型收到了该文件的实际内容,它就可以写一个有趣的回复发送给我们。它可能会说:“我读取了这个文件,它包含了一些代码或其他内容,无论文件里有什么。”

这种给予语言模型额外指令、要求它以特定格式回复的完整系统,被称为工具使用

  • 工具用于赋予模型额外的能力。
  • 模型负责以特定的方式回应。
  • 然后,像我们的编程助手这样的工具,将负责实际执行所请求的操作,例如真正读取文件、写入文件或其他操作。

同样,这是所有语言模型的工作原理,它们都基于“工具使用”这个概念。

现在,这是需要理解的关键部分:Claude 系列模型(Sonnet 和 Haiku)在理解工具功能、有效使用工具完成任务,以及以非常有趣的组合方式使用工具来完成更高级或更复杂的任务方面,表现得特别出色。

Claude 强大的工具使用能力是 Claude Code 作为编程助手的绝对核心优势。

以下是原因:

  1. 处理复杂任务:正如我刚才提到的,凭借更好的工具使用能力,Claude 可以处理更复杂的任务。
  2. 可扩展性:Claude Code 本身是可扩展的,因此很容易向 Claude Code 添加新工具,而 Claude 会很乐意使用这些工具。考虑到开发领域日新月异的变化,这对于保持持续的相关性尤为重要。换句话说,Claude Code 是一个在未来几年里能与你共同成长的助手。
  3. 提升安全性:最后,随着工具使用能力的提升,你通常会获得更好的安全性。因为 Claude 可以有效地搜索你的代码库以找到相关代码,而无需依赖索引。索引通常需要将你的整个代码库发送到外部服务器。

本节课中,我们一起学习了编程助手的本质。

  • 请记住,编程助手在内部使用语言模型来完成不同的任务。
  • 这些语言模型需要知道如何使用工具来处理它们收到的大多数任务。
  • 工具用于读取文件、写入文件、运行命令,以及本质上所有不仅仅是生成一些文本的操作。
  • 并非所有语言模型都能在同一水平上使用工具,这对编程助手的整体效率有很大影响。

在本节课中,我们将通过几个具体的任务演示,深入了解 Claude Code 如何智能地使用其内置及扩展的工具集来解决问题。你将看到 Claude Code 在性能优化、数据分析、UI 改进和代码审查等场景下的实际应用。


上一节我们介绍了 Claude Code 的核心能力。本节中我们来看看它如何利用默认工具集完成实际任务。

Claude Code 默认具备一系列工具能力,例如读取文件、写入文件、执行命令等。以下是 Claude Code 利用这些工具智能完成任务的两个示例。

我要求 Claude Code 在 chalk 库中查找并优化性能问题。chalk 是一个用于在终端输出彩色文本的 JavaScript 包。虽然功能简单,但它是整个 JavaScript 生态系统中下载量第五大的包,上周下载量达 4.29 亿次。优化此库的性能具有显著价值。

我要求 Claude 运行基准测试,识别性能最差的用例,使用分析工具找出运行缓慢的原因并进行修复。

Claude Code 将使用多种工具来智能地解决此问题。以下是其执行步骤:

  • 它会创建一个待办事项列表来跟踪进度。
  • 执行命令来运行基准测试。
  • 写入文件以更精确地聚焦于特定用例。
  • 使用 CPU 分析器来理解该用例运行缓慢的原因。
  • 最后实施改进。

最终,我们在该库的某个特定操作上获得了 3.9 倍 的吞吐量提升。

这个例子展示了 Claude 如何将不同的工具调用串联起来完成复杂任务。

我交给 Claude 一个 CSV 格式的数据集,其中包含一个视频流媒体平台的不同用户信息。我要求它对数据进行通用分析,识别平台上用户流失的一些原因,并且所有分析都要在 Jupyter Notebook 中完成。

这是有效使用工具的重要示例。Claude 不仅仅是将代码写入 Notebook,它还能在不同的单元格中执行代码并查看执行结果。这意味着 Claude 可以先在 Notebook 中初步查看数据,然后定制后续的每个单元格,以深入探究特定细节。


上一节我们看到了 Claude Code 使用内置工具的能力。本节中我们来看看如何通过添加新工具来扩展其功能。

我想展示一个任务示例,通过赋予 Claude Code 访问新工具集的能力来扩展其功能。我构建了一个小型应用,可以根据左侧屏幕输入的描述生成 UI 组件,生成的组件会显示在右侧。该应用可以轻松生成外观良好的组件,但左侧的聊天界面和顶部的标题栏看起来不太美观。

因此,我将使用 Claude Code 来改进样式。如果我只是要求它修复聊天界面和标题栏的样式,它可能会做得很好。但我的目标是向你展示向 Claude Code 添加额外功能是多么容易。

除了样式任务,我还将赋予 Claude Code 访问由 Playwright MCP 服务器 提供的新工具集的能力。这些工具允许 Claude 直接打开和控制浏览器。

以下是该过程的实际操作。我要求 Claude 改进我的应用样式,并使用浏览器来完成。它将在屏幕右侧打开一个浏览器,导航到我的应用,截取屏幕截图以查看当前样式,然后更新样式。我们甚至可以要求 Claude 在完成后再次截取页面截图,并多次迭代设计,以获得真正有组织、美观且突出的设计。

不久之后,我们就得到了一个看起来相当合理的设计。


Claude 出色利用工具的能力,使得 Claude Code 能够随着你和你的团队在未来共同成长。让我立即展示一个例子。

Claude Code 与 GitHub 有非常紧密的集成。你可以将 Claude Code 设置在 GitHub Action 中运行,它会根据特定事件(如创建拉取请求或在 Issue 中被直接提及)自动执行。当 Claude Code 在 GitHub 上运行时,它不仅能够查看和运行你的代码,还能获得一套用于与 GitHub 交互的新工具,例如创建评论、提交或拉取请求等。

你可以利用此集成来自动审查拉取请求。让我展示一个例子。

首先让我为你设置一个小场景。假设我们正在 AWS 上构建一些基础设施,我们所有的基础设施都定义在一组 Terraform 文件中,这些文件被提交并存储在 GitHub 上。因为我们所有的基础设施都定义在 Terraform 文件中,所以 Claude Code 非常清楚信息是如何在我们的基础设施中流动的。

现在假设在这个应用中,我有一个 DynamoDB 表。我在其中存储了一些关于用户的不同信息,包括可能看过的节目计划和注册日期。出于某种原因,我们可能希望与某个内部营销团队以及某个外部营销团队共享这些节目计划和注册日期信息。因此,另一家公司可以访问我们写入此存储桶的数据。对我们来说,始终了解随时间推移有哪些信息被写入该存储桶非常重要。

我们可能每晚运行一个 Lambda 函数,提取所有已添加到该表中的不同用户,然后仅提取看过的节目计划和注册日期,并将其存储在 S3 存储桶中。这样,这两个营销团队就可以访问这些信息。

现在,假设几个月后,内部营销团队要求我们也将电子邮件存储在此 S3 存储桶中。因此,我们可能会进入 Lambda 函数,仅添加一行代码,将用户的电子邮件也存储到存储桶中。由于这是几个月后的事情,我们可能已经完全忘记了这个 S3 存储桶是与外部营销合作伙伴共享的。所以此时,我们正在将个人身份信息放入这个可由另一家公司访问的存储桶中。这是一个很大的错误,绝对是我们不想做的事情。但同时,这确实是一种可能发生的错误,如果我们不清楚这个 S3 存储桶到底发生了什么,就很难发现。

事实证明,Claude Code 可以很容易地在拉取请求中发现这种情况。

具体来说,因为我们所有的基础设施都定义在这些 Terraform 文件中。

以下是一个快速示例。我构建了刚才在图表中向你展示的那个项目。我创建了一个拉取请求,以在 Lambda 函数中添加用户的电子邮件。因此,我更改的唯一一行代码就是那里,我说对于每个用户,我想获取他们的电子邮件并将其也添加到存储桶中。

现在,Claude Code 对我的基础设施有非常清晰的了解,因此它能够在我们现在看到的自动审查中,查看我在这个拉取请求中所做的所有更改。它能够准确弄清楚我的基础设施是如何工作的,并且能够识别出我正在向合作伙伴暴露一些个人身份信息。

它在这里列出了数据流,即发生的具体步骤,并详细说明了这个存储桶是如何与外部合作伙伴共享的。在开发过程中发现此类问题,而不是在部署此更改之后,是利用 Claude Code 在 GitHub 上集成的巨大优势。我将在后面详细介绍,并确切展示如何设置与此完全相同的流程。


本节课中我们一起学习了 Claude Code 如何通过智能使用工具来解决实际问题。我们看到了它在性能优化、交互式数据分析、UI 样式改进以及与 GitHub 集成进行自动化代码审查等方面的强大能力。请记住,你应当将 Claude Code 视为一个灵活的助手,它可以被定制,并随着时间推移不断成长和变化,以满足你团队的需求。

在本节课中,我们将学习如何为 Claude Code 提供**的项目上下文,以提升其理解和协助编程的效率。核心在于理解并管理提供给 Claude 的信息量,确保其获得足够且相关的信息。

在典型的项目中,可能存在数十甚至数百个文件,每个文件都包含大量信息。当我们向 Claude Code 提问或分配任务时,存在一个理想的信息量,即 Claude 恰好需要足够的信息来理解如何回答问题或完成任务。一旦我们开始添加不相关的额外信息,Claude Code 的有效性就会开始下降。因此,引导 Claude 关注项目中相关的文件或文档至关重要。Claude Code 当然可以在没有引导的情况下工作,但如果你能提供一点指导,你将获得**结果。

上一节我们介绍了上下文管理的重要性,本节中我们来看看如何为 Claude 初始化项目上下文。

在我的编辑器中,我打开了终端,并通过运行 claude 命令来启动 Claude Code。

当你第一次在项目中运行 Claude Code 时,我强烈建议运行 /init 命令。这会让 Claude 深入查看你的整个代码库。它会弄清楚项目的用途、总体架构、相关命令、关键文件等。完成这次搜索后,它会总结其发现,并将其放入一个名为 claude.md 的文件中。

当 Claude 尝试创建此文件时,它会请求权限。你可以按回车键接受,或者,如果你不想为每个文件写入请求都授予权限,也可以按 Shift 键,这将允许 Claude Code 在你的项目中自由写入文件。

我鼓励你打开生成的 claude.md 文件并查看其内容。如前所述,该文件的内容会包含在我们之后向 Claude 发出的每个请求中。这个文件主要有两个不同的目的:第一,它帮助 Claude 更好地理解你的代码库,从而能更快地找到相关代码;第二,它作为一个位置,你可以在此向 Claude 提供一些通用指导。

现在,我们来了解一下 Claude Code 会使用的多个 claude.md 文件。

  • 项目级:这是我们通过运行 /init 命令生成的文件。我们通常会将其提交到像 Git 这样的源代码控制中。我们将与其他工程师共享此文件,并且它会包含一些我们想要传递给 Claude 的特定于项目的指导。
  • 本地级:我们还可以创建一个 claude.local.md 文件。此文件不会被提交,通常也不会与其他任何工程师共享。在此文件中,你可以放入一些你希望 Claude 仅为你遵循的个人指令。
  • 全局级:你可以在你的机器上拥有一个全局 claude.md 文件。此文件将包含适用于你在本地运行的所有项目的指令。

我一直提到给 Claude 特殊或自定义的指令,现在让我给你展示一个例子。

假设 Claude 在编写的代码中过于频繁地使用注释。我们可以通过更新我们的 claude.md 文件来解决这个问题。我们可以手动修改文件,或者在 Claude Code 内部使用一个快捷方式:输入一个 # 号。这会让我们进入“记忆模式”,允许我们智能地编辑我们的一个 claude.md 文件。

因此,我们可以输入一个请求,例如“不要如此频繁地编写注释”。然后我会指定我想将此指令添加到项目的 claude.md 文件中。接着,Claude 会智能地将此指令合并到该文件中。如果我随后打开该文件并进行搜索,我会看到它确实添加了那条新指令。

现在我们已经创建了 claude.md 文件,我想让你更好地理解如何在对话中引入特定的上下文。

假设我们想更好地了解这个项目中的身份验证系统是如何工作的。我们可以直接让 Claude 告诉我们相关信息,在这种情况下,它会搜索我们的代码库并找到与身份验证系统相关的文件。这当然可行,但会花费一些时间。

或者,如果我们已经知道一些与身份验证系统相关的文件,我们可以使用 @ 字符来提及它们。当我们提及一个文件时,它会被自动包含在发送给 Claude 的请求中。这是引导 Claude 关注特定方向的一个绝佳技巧。

你可以使用相同的语法在 claude.md 文件中提及文件。让我给你展示一个例子,说明为什么这非常有用。

在这个项目的 prisma 文件夹中,有一个名为 schema.prisma 的文件。此文件包含了 SQLite 数据库中存在的所有不同表和记录类型的完整定义,该项目使用该数据库来存储信息。因为这个信息非常重要,并且与项目的许多方面都相关,我可能决定在我的 claude.md 文件中提及这个文件。

让我向你展示如何操作。首先,我会输入 # 进入记忆模式。然后我会提及那个模式文件,并特别告诉 Claude,每当它需要更好地理解数据库中数据的结构时,就参考该文件。更新完成后,我会查看 claude.md 文件,以确认备注已添加。

当你像这样提及一个文件时,其内容会自动包含在你的请求中。因此,如果我询问用户具有哪些属性,Claude 可以立即回答,而无需读取模式文件。

本节课中,我们一起学习了如何为 Claude Code 有效管理上下文。我们了解了运行 /init 命令创建项目级 claude.md 文件的重要性,认识了项目级、本地级和全局级配置文件的不同用途,并掌握了通过“记忆模式”添加自定义指令,以及使用 @ 语法在对话中直接引入特定文件来为 Claude 提供精准、高效的上下文指导。这些技巧将帮助你显著提升与 Claude Code 协作编程的效率。

在本节课中,我们将学习如何利用 Claude Code 对项目进行修改,并探索其核心功能,如截图引导、计划模式和深度思考模式,以提升代码编辑的效率和准确性。


上一节我们介绍了 Claude Code 的基本操作,本节中我们来看看如何通过截图来精确引导 Claude 进行界面调整。

首先,我想将左侧面板中的占位文本移动到面板中央,以帮助 Claude 准确理解我希望移动的内容。我将对该区域进行截图。

然后,我将使用 Ctrl + V 将截图粘贴到 Claude Code 中。请注意,在 Windows 上使用 Ctrl + V 粘贴截图,而非 Mac 上常用的 Command + V

粘贴截图后,我可以要求 Claude 将那个占位文本居中。经过短暂搜索,Claude 成功更新了样式。回到浏览器中查看,效果很好。


接下来,我想在这个应用中修改另一处内容。我将要求生成一个显示标题和描述的卡片组件。

卡片组件顺利生成,但在聊天界面的左侧出现了一个尴尬的术语:“字符串替换编辑器”。这个小面板本意是向用户提示正在创建文件,但目前使用了非常技术性的术语。

我希望向用户展示更友好的文本,直接告知用户正在创建文件及其名称。当然,我们也应该处理其他情况,例如编辑或删除文件,以更好地引导 Claude 的注意力。

我再次对该区域进行截图,以确保 Claude 完全理解我的意图。

回到 Claude Code,我粘贴图片,并要求 Claude 用更用户友好的信息替换那段特定文本。


这是一个稍具挑战性的任务,需要 Claude 在项目中做相当多的研究才能完成。当你给 Claude 一个较难的任务时,有两种方法可以轻松提升其智能。

以下是两种提升智能的方法:

  1. 启用计划模式:通过按两次 Shift + Tab 启用(如果已开启自动接受文件编辑,则按一次)。在计划模式下,Claude 会对项目内容进行更深入的研究,阅读更多文件,并制定完成任务的详细计划。计划完成后,Claude 会告诉你它打算如何执行。此时,你可以接受该计划让 Claude 实施,或者在某些方面(例如它忽略了某个文件或未考虑某些场景)引导 Claude。
  2. 启用思考模式:这会开启 Claude 的扩展思考功能,允许它对特定任务进行更深入的推理。有多种触发短语可以启用思考模式,每个短语都为 Claude 提供了逐步增大的思考令牌预算。鉴于这是一个较复杂的任务,我可能会要求 Claude “深入思考”**实现方式。

最后需要理解的是,计划模式和思考模式可以结合使用。因此,除了要求“深入思考”,我还将同时开启计划模式。然后运行任务,观察 Claude 实现此功能的效果。


你可能会疑惑,何时该使用计划模式,何时该使用思考模式。

可以将这两者视为处理广度深度的工具:

  • 计划模式适用于需要广泛理解代码库、查看不同区域的任务,也适用于需要多个步骤才能完成的复杂任务。
  • 思考模式则在你专注于某个特定的棘手逻辑点或排查困难错误时非常有用。

第二个问题可能是:是否应该始终启用思考和计划模式?你当然可以这样做。但请记住,计划模式和思考模式会消耗额外的令牌,因此使用它们会产生相应的成本。


经过几分钟的工作,功能似乎已完成。我回到编辑器进行测试。

我们立刻可以看到,状态信息比以前更友好了。用户现在被告知正在创建文件。如果我发送一个后续请求,例如更改标题,希望在后续操作中能看到关于编辑该文件的提示。果然,现在我们看到的是正在编辑 App.jsx 文件。可以说,Claude 成功实现了这个功能。

现在我们已经对项目做了一些修改,应该提交这些更改。Claude Code 是一个可靠的 Git 助手。我们可以要求它暂存并提交更改,它会为我们编写描述性的提交信息。


本节课中我们一起学习了如何利用 Claude Code 进行项目修改。我们掌握了通过截图精确引导界面调整的方法,生成了新的组件,并优化了用户提示文本。更重要的是,我们深入探讨了提升 Claude 智能的两种核心模式:计划模式Shift + Tab)用于处理需要广度和多步骤的任务,以及思考模式(通过特定短语触发)用于攻克深度逻辑难题。最后,我们还使用 Claude Code 完成了 Git 提交操作。合理运用这些功能,将能显著提升你的开发效率。

在本节课中,我们将学习几种不同的技术,用于控制和引导与 Claude 的对话流程。掌握这些技巧能有效提升 Claude 的工作效率和专注度。

与 AI 助手进行长时间对话时,上下文管理至关重要。无关的对话历史会分散 Claude 的注意力,导致其偏离当前任务。本节将介绍几个核心快捷键和命令,帮助你清理、回溯和压缩对话历史,确保 Claude 始终保持专注。

当 Claude 正在生成内容,但你希望其停止并转向其他任务时,可以使用 Escape 键。

基本示例:我要求 Claude 为一个认证文件中的函数编写测试。Claude 迅速制定了一个编写多个测试的计划。然而,我知道测试这个文件有些困难,希望 Claude 一次只测试一个功能。

此时,我可以按下 Escape 键来中断 Claude。这将使 Claude 立即停止生成,允许我建议一条不同的路径。

结合 Escape 键和“记忆”功能,是纠正 Claude 重复性错误的强大方法。

示例:我再次要求 Claude 为同一个文件编写测试。这次,它试图读取一个实际并不存在的测试配置文件。这是一个我在本项目上见过 Claude 犯过的错误。

为了阻止这个错误再次发生,我迅速按下 Escape 键中断它。然后,我使用 # 快捷键添加一条关于该测试配置文件正确名称的记忆。这样,我可能就不会再看到这个错误了。

一些对话控制快捷键看似只是为了方便,但若使用得当,能显著提升 Claude 有效工作并保持专注的能力。

让我们看一个更实际的例子。在 O.ts 文件中有四个不同的函数,我希望让 Claude 为它们逐个编写测试,首先从名为 createSession 的函数开始。

Claude 会尝试编写测试,但在运行过程中遇到了一个错误,并花了一些时间进行调试。结果发现是我忘记安装一个包。

最终,测试完成并运行通过。是时候开始编写下一组测试了。但问题是:在我的对话历史中,现在充满了关于那个缺失包的来回讨论。这些上下文与编写下一组测试完全无关。

理想情况下,我们能够“时光倒流”,回到之前发送的消息,并将其更新为“为 getSession 函数编写测试”。这样做的好处是,我们保留了 Claude 已经查看过 O.ts 文件内容的上下文,并且当我们提到 getSession 时,它已经知道我们在说什么。同时,因为我们丢弃了所有关于调试的额外消息,Claude 在这里受到的干扰会少很多。这样,Claude 就能真正保持专注和任务导向。

要回溯对话历史,请按两次 Escape 键。这将显示你迄今为止发送的所有不同消息,从而允许你回退到之前的时间点,跳过一些中间的对话。

Claude 现在开始处理下一组测试。这一次,Claude 保持了高度专注,但不幸的是,它遇到了许多问题。最终它解决了这些问题并使测试通过。此时,Claude 已经独立工作了几分钟,并且对如何为此文件编写测试有了很好的理解。

同时,我们的对话历史中再次积累了大量上下文。当需要为下一个函数编写测试时,我将使用一个名为 Compact 的命令。

Compact 命令将获取当前对话中的所有消息并对它们进行总结。当 Claude 已经对当前任务学习了很多知识,并且你希望将这些知识保留到下一个任务中时,Compact 命令非常有用。






最后一个需要了解的上下文相关命令是 Clear 命令。Claude 将清空整个对话历史,允许你从头开始。

Clear 命令在你即将开始一个与当前任务完全无关的新任务时最为有用。














本节课中,我们一起学习了控制 Claude 对话上下文的几种核心方法:

  1. Escape:中断 Claude 的当前生成,以便引导新方向。
  2. Escape + Escape:回溯对话历史,跳过无关的中间对话,回到干净的上下文起点。
  3. Compact:压缩并总结当前对话,保留关键知识,移除冗余细节,为后续任务做准备。
  4. Clear:清空整个对话历史,为全新的、不相关的任务做好准备。

我建议频繁使用这些快捷键,特别是在切换任务时,或者任何与 Claude 进行长时间对话的场景中。在本课程的剩余部分,我们将多次使用这些技巧,以确保 Claude 保持专注和任务导向。

在本节课中,我们将要学习如何在 Claude-Code 中创建和使用自定义命令。自定义命令可以帮助你自动化那些频繁执行的重复性任务,从而提升开发效率。

运行 Claude-Code 时,你可以输入一个斜杠 / 来查看一系列由 Claude-Code 默认内置的命令。除了这些默认命令,你还可以轻松地添加自己的自定义命令。

自定义命令对于自动化那些你发现自己经常运行的重复性任务非常有用。

上一节我们介绍了自定义命令的概念,本节中我们来看看如何实际创建一个自定义命令。

让我们通过一个例子来了解如何创建一个自定义命令。在我的项目目录中,我需要找到 .cloud 文件夹。在该文件夹内,我将创建一个名为 commands 的新目录。然后,在该目录中,我将创建一个名为 audit.md 的新文件。

我们创建的文件名(在本例中是 audit)将成为我们最终运行的命令名称。这个命令的目标是审计所有已安装到该项目中的不同依赖项,如果存在任何漏洞则更新它们,然后运行测试以确保没有实际破坏任何功能。

创建命令文件后,你需要重启 Claude-Code。请不要忘记重启它。当你重启 Claude-Code 后,输入 /audit。这将显示你刚刚创建的命令。然后你可以运行这个命令。在本例中,它将完全按照我们要求 Claude 做的去执行:运行命令,检查是否存在任何易受攻击的包,必要时修复它们,然后运行测试。

命令也可以接收参数。让我展示一个例子。我将创建另一个名为 write_tests 的命令。当我运行这个命令时,我希望为项目中一个非常特定的文件创建一些测试。

在命令文本中,我将放入一个占位符 $arguments。当我运行命令时,如果我传入一个文件路径,该路径将**入到 $arguments 的位置。

所以现在我可以再次重启 Claude-Code,然后执行 write_tests 命令。需要明确的是,我们传入的参数不一定必须是文件路径。它可以是任何我们想要传入的字符串。因此,我可能会随意地要求为某个特定文件夹中的文件编写测试,给 Claude 一点关于在哪里查找的指示。

本节课中我们一起学习了如何在 Claude-Code 中创建和使用自定义命令。我们了解了创建命令文件的步骤,即:在项目的 .cloud/commands/ 目录下创建 .md 文件。我们还学习了如何通过 $arguments 占位符为命令传递参数,这极大地增强了命令的灵活性。通过自定义命令,你可以将重复的工作流程封装起来,让 Claude-Code 更高效地辅助你的开发工作。

在本节课中,我们将学习如何通过 MCP 服务器为 Claude Code 添加新的工具和能力,并以 Playwright MCP 服务器为例,演示如何让 Claude Code 控制浏览器并自动优化我们的应用。

MCP 服务器可以远程运行,也可以在您的本地机器上运行。一个非常流行的 MCP 服务器名为 Playwright,它赋予 Claude Code 控制浏览器的能力。接下来,我们将演示如何将其添加到 Claude Code,并利用它来进一步开发我们的应用。

上一节我们介绍了 MCP 服务器的概念,本节中我们来看看如何具体安装和配置一个 MCP 服务器。

首先,在您的终端(不是在 Claude Code 内部)执行以下命令来添加一个 MCP 服务器。我将它命名为 playwright,并指定启动该服务器的本地命令。

claude mcp add playwright --command "启动服务器的命令" 

执行此命令后,我们便可以启动 Claude Code,并要求它打开浏览器并导航到我们的应用程序 localhost:3000

在浏览器打开之前,您可能会注意到需要授权该工具运行。如果您厌倦了这些授权弹窗,可以打开 Claude Code 设置目录下的 local.settings.json 文件。

以下是配置步骤:

  1. allow 数组中,添加一个字符串:MCP__playwright(注意中间有两个下划线)。
  2. 此设置允许 Claude Code 在任何时候使用此 MCP 服务器及其内部工具,而无需每次都请求权限。

如果我重启 Claude Code 并再次要求它打开浏览器,它将直接执行,不再需要我授权。

配置好 MCP 服务器后,我们来看看如何将其应用于实际项目开发中。Playwright MCP 服务器有非常多的用途,我将展示一个与我们当前项目高度相关的应用。

回到我的代码编辑器中,我可以找到 src/lib/prompts/generation.tsx 文件。这个文件中的提示词用于在我们的应用中生成您所请求的组件。

我希望允许 Claude Code 使用浏览器,自行生成一个组件,然后根据生成的组件自行调整这个提示词。最终,我们希望应用能生成外观更佳的组件。

以下是具体操作流程:

  1. 在 Claude Code 中,要求它导航到 localhost:3000
  2. 尝试生成一个组件。
  3. 查看生成的源代码并评估其样式。
  4. 更新 generation.tsx 文件中的提示词。
  5. 最终目标是让我们生成的组件拥有更好的样式。

让我们看看效果如何。Claude 首先会打开浏览器,尝试生成一个组件。从 Claude 的评论中可以看出,它似乎对生成的结果不太满意。您可能会注意到,它抱怨了一个在此类应用中非常常见的样式:紫色到蓝色的渐变。

随后,Claude 将更新我们的提示词,并尝试生成一个新组件。说实话,结果比我预期的要好得多。这个生成的推荐卡片看起来非常棒。

仅从这些结果来看,您可以立即感受到 MCP 服务器确实为许多有趣的使用场景打开了大门。我强烈建议您探索一些可能有助于 Claude 开发您个人项目的 MCP 服务器。

本节课中,我们一起学习了如何通过 MCP 服务器扩展 Claude Code 的功能。我们以 Playwright 为例,完成了从安装配置到实际应用的全过程,最终实现了让 Claude Code 自动评估并优化生成组件样式的目标。这展示了 MCP 服务器在增强 AI 编程助手能力方面的强大潜力。

在本节课中,我们将学习如何为 Claude Code 设置官方的 GitHub 集成。此集成允许 Claude Code 在 GitHub Actions 工作流中运行,从而实现自动化的代码审查和任务处理。

Claude Code 提供了一个官方的 GitHub 集成。通过此集成,Claude Code 可以在 GitHub Action 工作流中运行。这为自动化代码审查和响应特定事件(如在 Issue 或 Pull Request 中 @ 提及 Claude)提供了可能。

上一节我们了解了集成的概念,本节中我们来看看如何具体设置。

你可以通过运行 /install Github app 命令来设置此集成。此过程将引导你完成几个步骤。

以下是设置步骤:

  1. 你需要在 GitHub 上安装 Claude Code 应用。
  2. 接下来,你需要添加一个 API 密钥。
  3. 完成上述步骤后,一个 Pull Request 将被自动生成。

这个自动生成的 Pull Request 会添加两个不同的 GitHub Action 工作流配置文件。

现在我们已经完成了基本设置,让我们深入了解这两个自动添加的 Action 具体能做什么。

第一个 Action 添加了 @ 提及支持。这意味着在 Issue 或 Pull Request 中,你可以通过 @Claude 来提及 Claude,并给它分配一些任务去执行。

第二个 Action 添加了对 Pull Request 的审查支持。每当你创建一个 Pull Request 时,Claude Code 会自动运行并审查提议的代码变更。

这两个 Action 都可以进行自定义。你也可以基于其他类型的事件(如推送代码)来添加额外的 Action 以触发 Claude Code。

了解了基本功能后,本节我们将通过一个实例来学习如何自定义 @ 提及功能的工作流程。

首先,我们需要将 GitHub 上自动生成的那两个 Action 配置文件合并到我们的代码仓库中。然后,将这些变更拉取到本地机器。

接着,在新创建的 .github/workflows 目录下,你会看到这两个 Action 配置文件。一个用于支持 Pull Request 审查,另一个用于处理 @ 提及。

现在,我来演示如何自定义 @ 提及功能。当我在 Issue 或 Pull Request 中 @Claude 时,我希望它能够在 GitHub Action 环境中运行项目,并使用 Playwright MCP 服务器在浏览器中访问应用。

为了实现这个目标,我首先需要在这个工作流文件中,于 Claude Code 运行之前添加一个步骤。这个步骤将执行项目安装并启动开发服务器。

然后,我将更新 Claude Code 的配置。我会添加一些自定义指令,这些指令会直接传递给 Claude,允许我们提供额外的方向或上下文。在本例中,我会告诉 Claude 开发服务器已经启动,并且如果需要,可以使用 Playwright MCP 服务器在浏览器中访问应用。

接下来,我还需要添加一些配置来设置 Playwright MCP 服务器本身。

这里还有一个需要注意的事项。当你在 Action 中运行 Claude Code 时,必须明确列出你想要授予 Claude Code 的所有权限。这里有一个棘手的地方:如果你使用 MCP 服务器,你必须逐个列出你希望允许的、来自每个 MCP 服务器的每个工具。没有像我们之前看到的权限快捷方式。不幸的是,Playwright MCP 服务器有很多不同的工具,因此每个都需要被列出。














完成此配置更新后,务必提交并推送这些更改。

配置完成后,现在是时候测试这个更新后的工作流了。

我将在我们的实际应用中给 Claude 一个小任务。看这里的两个按钮,目前它们工作正常,我可以在预览面板和代码面板之间切换。

但我要假设它们没有按预期工作。我将用那个按钮截一张图。然后,我去创建一个 Issue,粘贴截图,并用 @Claude 提及它,要求它验证这两个按钮是否按预期工作。

创建 Issue 后,等待即可。Action 启动和 Claude 响应需要一两分钟。请记住,正如我们刚才看到的,在 Claude Code 开始运行之前,Action 会先完成整个应用的安装和启动。

😊 最终,Claude 会做出响应。它通常会创建一个步骤清单来完成给定任务。在本例中,它将尝试访问应用,手动测试按钮,并修复发现的任何问题。Claude 会注意到按钮实际上工作正常,因此它会提前终止,并附上记录其发现的信息。

本节课中,我们一起学习了 Claude Code 官方 GitHub 集成的设置与使用方法。我们了解了如何通过简单的命令完成集成安装,探索了其核心的 @ 提及和 PR 审查功能,并通过一个实际案例学习了如何自定义工作流以满足特定需求,例如在 Action 中启动开发服务器并集成 MCP 工具。这只是使用 Claude Code GitHub 集成的一个小例子,建议你花时间思考如何根据你自己的项目需求进行定制。

在本节课中,我们将要学习 Claude-Code 中一个强大的功能:钩子 (Hooks)。钩子允许你在 Claude 尝试运行一个工具之前或之后执行自定义命令,从而实现非常有趣且实用的功能。

上一节我们介绍了 Claude-Code 的基本工具调用流程。本节中我们来看看如何通过钩子来干预和扩展这个流程。

当你在 Claude-Code 中提出请求时,你的查询会连同一些工具定义一起发送给云端模型。Claude 模型随后可能决定通过提供一个精心格式化的响应来运行一个工具。此时,就由 Claude-Code 来运行所请求的工具,例如读取一个文件,然后返回该工具调用的结果。

钩子赋予我们在工具执行之前之后立即执行代码的能力。在工具之前运行的钩子被称为 预工具使用钩子,因为它们运行在工具之前。在工具之后运行的钩子则被称为 后工具使用钩子

以下是钩子可以实现的一些具体功能示例:

  • 在 Claude 决定写入一个文件后,你可以自动在创建的文件上运行代码格式化工具。
  • 在文件被编辑后,你可以运行测试。
  • 你可以阻止 Claude 读取特定的文件。

可能性是无穷的,我们稍后会展示几个很好的例子,为你提供如何在特定项目中使用钩子的思路。

要定义钩子,我们需要在 Claude 的设置文件中添加配置。请记住,有几种不同的设置文件:一个用于你机器上所有项目的全局设置,一个用于你的特定项目并与其它工程师共享,还有一个仅用于你在特定项目上的个人设置。

你可以通过两种方式添加钩子:手动在此文件中编写,或者在 Claude-Code 内部使用内置的 /hooks 命令。

配置本身看起来像你在此屏幕右侧看到的内容。让我带你浏览这个示例文件,以便你更好地理解发生了什么。

首先,请注意文件中有两个不同的部分。一个部分列出了所有应在工具使用之前执行的命令,即预工具使用钩子。另一个部分列出了所有应在工具使用之后执行的不同命令,即后工具使用钩子

在每个部分中,我们提供一个匹配器 (matcher)。这指明了我们正在寻找哪种工具使用类型。例如,在预工具使用部分,配置可能如下:

GPT plus 代充 只需 145{ "preToolUse": [ { "match": "Read", "command": "echo '即将读取文件'" } ] } 

在这个例子中,每当 Claude-Code 尝试读取一个文件时,我都希望运行那里列出的命令。

同样,在后工具使用部分,配置可能如下:

{ "postToolUse": [ { "match": ["Write", "Edit", "MultiEdit"], "command": "./format_file.sh" } ] } 

WriteEditMultiEdit 工具的使用之后,有一个我想运行的不同命令。

这是重要的部分,也是钩子真正设计用来做的事情。你看到的那些命令将被提供关于 Claude 想要运行的工具调用的详细信息。

对于预工具使用钩子,你可以检查 Claude 想要做什么。如果出于任何原因你不想允许它,你可以阻止工具使用操作,并向 Claude 发送一条错误消息。

对于后工具使用钩子,工具调用已经发生,因此阻止它为时已晚。但是,你可以基于该工具调用执行一些后续操作,比如格式化刚刚编辑的文件。你也可以向 Claude 提供关于该工具使用的消息。

例如,你可能会决定运行一个单独的程序来检查编辑的代码质量,或者进行类型检查,然后将该反馈提供给 Claude。Claude 随后可能会根据该反馈对其刚刚写入的文件进行更新。

如果仍然对钩子是什么或其设计目的感到困惑,这完全没关系。理解钩子可能真的很有挑战性。

所以,让我们稍后回来,在一个示例项目中实践钩子的使用。


本节课中我们一起学习了 Claude-Code 中钩子的基本概念。我们了解了钩子是什么,它们如何在工具调用前后运行,以及如何通过配置文件来定义它们。我们还探讨了钩子的一些潜在应用场景,例如自动代码格式化、运行测试或实施访问控制。在接下来的实践中,我们将通过具体示例来加深理解。

在本节课中,我们将学习如何为 Claude Code 创建自定义钩子(hooks)。钩子是一种强大的机制,允许你在 Claude 执行特定操作(如读取文件)之前或之后运行自定义代码。我们将通过一个实际项目,创建一个用于阻止 Claude 读取敏感文件的钩子。

上一节我们介绍了钩子的基本概念,本节中我们来看看如何一步步构建一个实际的钩子。

为了更好地理解钩子的工作原理,我们将查看一个新的示例项目。

请将本讲座附件 queries_do.zip 下载并解压。建议你下载此项目,并在你的代码编辑器中打开它。

打开编辑器后,在终端中运行以下命令:

GPT plus 代充 只需 145npm run setup 

此命令将安装一些依赖项,并为使用钩子做好准备。

为了更深入地理解钩子,我们将在该项目中创建自己的钩子。

我们的钩子目标是:项目根目录下有一个名为 .env 的文件,该文件包含一些敏感信息。出于谨慎考虑,我们希望完全阻止 Claude 直接读取此文件。

让我们通过几张图来帮助你理解如何构建这个钩子。

第一步是决定我们需要一个 pretooluse(工具使用前)钩子还是一个 posttooluse(工具使用后)钩子。














在这个场景中,我们希望阻止 Claude 读取特定文件。如果我们使用 posttooluse 钩子,那么钩子或命令将在 Claude 已经读取文件之后执行。因此,在这种情况下,我们肯定需要一个 pretooluse 钩子,以确保我们能够阻止读取操作的发生。

接下来,我们需要确定要监视哪些类型的工具调用。

图表右侧列出了所有当前可用的工具名称。记住 Claude Code 中包含的所有不同工具名称可能非常具有挑战性,特别是因为你可以通过 MCP 服务器添加自己的自定义工具。

这里有一个小技巧可以帮你。如果我回到 Claude Code 界面,可以直接要求 Claude 列出它当前有权访问的所有不同工具名称的要点列表。

在所有这些不同的工具中,有两个工具可以非常容易地读取文件内容。第一个是 read 工具。另一个容易被忽略,但同样可以读取文件内容的是 grep 工具。grep 可以搜索文件内容。

因此,我们确实需要监视 read 工具和 grep 工具的调用。






接下来,我们需要编写一个命令,该命令将接收有关 Claude 想要进行的工具调用的一些信息。

以下是这部分的工作原理。我们将编写一个命令,Claude 会自动执行它。然后,Claude 会将一些工具调用数据以 JSON 格式通过标准输入(stdin)传递给该进程。

图表右上角有一个工具调用数据的示例。它将是一个大的 JSON 对象,包含有关工具名称和该工具输入的信息。在本例中,工具名称是 read。这意味着 Claude 正试图调用 read 工具,并且它可能正试图读取指向那个 .env 文件的特定文件路径。重申一下,这就是我们想要阻止读取操作的文件。

因此,在我们的程序或命令内部,需要通过标准输入接收此信息,解析该 JSON,然后读取工具名称、工具输入参数等,并决定我们想要如何处理这个工具调用。

进入第四步。在我们的命令接收到提议的工具调用数据后,我们将退出。我们的退出码将向 Claude Code 提供一个信号。

退出码 0 表示一切正常,我们希望允许此工具调用发生。

然而,退出码 2 是向 Claude Code 发出的信号,表示我们希望阻止此工具调用。这仅适用于 pretooluse 钩子。因为请记住,只有在 pretooluse 钩子中,我们才能实际阻止工具调用。

如果我们以代码 2 退出,那么在此期间我们在命令内生成的任何标准错误日志也将作为反馈发送给 Claude。这样,我们既可以拒绝工具调用,同时也可以给 Claude 一个理由。

以上就是整个过程。我知道这里涉及很多内容,所以让我们通过实际项目来演练连接此钩子所需的所有步骤,以理解所有这些步骤是如何结合在一起的。

本节课中我们一起学习了如何为 Claude Code 定义钩子。我们了解了钩子的两种类型(pretooluseposttooluse),确定了需要监视的工具调用(readgrep),并理解了钩子命令如何通过标准输入接收 JSON 数据以及如何通过退出码(0 允许,2 阻止)向 Claude Code 提供反馈。下一节,我们将动手实现这个保护敏感文件的钩子。

在本节课中,我们将学习如何为 Claude Code 实现一个自定义的“钩子函数”。核心目标是防止 Claude 读取 .env 文件的内容。我们将通过配置一个“工具使用前钩子”来拦截并阻止相关的文件读取操作。

上一节我们讨论了需要设置的各种配置选项。本节我们将主要聚焦于具体的实现步骤。

首先,我们需要在 Claude Code 的配置文件中指定我们的钩子。

  1. 在项目根目录下,打开 .claude 文件夹中的 settings.local.json 文件。
  2. 在该文件中,你会找到 pre_tool_use_hookspost_tool_use_hooks 的配置列表。
  3. 我们的目标是在 Claude 调用工具之前进行拦截,因此需要配置一个 pre_tool_use_hooks

以下是为我们预先添加的配置模板,你只需填写 matchercommand 字段:

{ "matcher": "read|gr", "command": "node ./hooks/read_hook.js" } 

以下是配置项的详细说明:

  • matcher:用于匹配我们想要监控的工具名称。我们希望监控 read(读取文件)和 gr(全局搜索)这两个工具。使用管道符号 | 来分隔它们。
  • command:当 Claude 尝试调用上述匹配的工具时,需要执行的命令。这可以是任何 CLI 命令或脚本。为了与项目其他部分保持一致,我们将调用一个预先放置在 hooks 目录下的 Node.js 脚本 read_hook.js

保存此配置文件。接下来,我们需要实现 read_hook.js 脚本中的逻辑。

现在,我们需要实现 read_hook.js 文件,该文件会在 Claude 调用 readgr 工具时执行。

该脚本的核心逻辑是:

  1. 接收 Claude 传入的工具调用信息。
  2. 检查目标文件路径是否包含 .env
  3. 如果是,则阻止操作并向 Claude 返回错误信息。

脚本顶部已经包含了从标准输入读取并解析 JSON 数据的代码。解析后得到的 tool 对象,其结构如下所示:

GPT plus 代充 只需 145{ "session_id": "...", "tool_name": "read", // 或 "gr" "tool_input": { "path": "/path/to/some/file" // ... 其他输入参数 } // ... 其他属性 } 

我们的任务是检查 tool_input.path 这个文件路径。如果路径中包含 .env,我们就需要阻止此次操作。

以下是实现此检查的关键代码:

// 从工具输入中获取文件路径,同时处理可能的路径字段变体 const readPath = tool.tool_input?.path || tool.tool_input?.file_path; if (readPath && readPath.includes('.env')) { // 向标准错误输出日志,Claude 会接收到此信息 console.error('You cannot read the .env file.'); // 以退出码 2 结束进程,向 Claude 表明操作被阻止 process.exit(2); } 

代码解释

  • 我们首先尝试从 tool_input 中获取 path 属性。对于 gr 工具,路径可能位于 file_path 属性下,因此代码中使用了回退逻辑。
  • 使用 .includes(‘.env’) 方法判断路径是否包含目标文件名。
  • 如果匹配,则通过 console.error 输出错误信息到标准错误流,Claude 会将其作为反馈接收。
  • 最后调用 process.exit(2) 退出进程,退出码 2 向 Claude 表明该操作被钩子函数主动阻止。

实现完成后,我们需要测试钩子是否生效。

  1. 保存所有文件
  2. 重启 Claude Code。这是关键步骤,因为对钩子配置的修改需要重启才能生效。
  3. 在 Claude Code 中,尝试让 Claude 读取 .env 文件。
  4. 此时,Claude 的调用会被我们的钩子拦截,并收到错误信息:“You cannot read the .env file.”。Claude 能够识别这是被一个“读取钩子”所阻止。
  5. 同样,尝试让 Claude 使用 gr 工具搜索 .env 文件的内容,操作也会被成功阻止。

至此,我们已经成功实现并测试了一个基础的自定义钩子函数。它能够有效防止 Claude 访问敏感的 .env 文件。

本节课中,我们一起学习了如何为 Claude Code 实现一个自定义钩子函数。我们首先在 settings.local.json 中配置了 pre_tool_use_hooks,指定了要监控的工具 (read|gr) 和触发的命令。接着,我们实现了 read_hook.js 脚本,通过检查文件路径并返回错误信息来阻止对 .env 文件的访问。最后,我们通过重启 Claude Code 并测试,验证了钩子函数的有效性。这个例子展示了如何使用钩子机制来增强 Claude Code 的安全性和可控性。

在本节课中,我们将学习如何创建和使用“钩子”来增强 Claude Code 的能力,解决它在大型项目中可能遇到的两个常见问题:类型错误传播和代码重复。

Claude Code 是一个强大的编码助手,但在处理复杂项目时,它有时会忽略一些重要的上下文。本节课将介绍两种实用的钩子:一种用于在编辑 TypeScript 文件后自动运行类型检查并反馈错误;另一种用于在特定目录(如查询目录)中检测并防止代码重复。通过实现这些钩子,我们可以引导 Claude Code 做出更符合项目整体结构的决策。


上一节我们概述了本节课的目标,本节中我们来看看第一个具体问题:Claude Code 在修改函数定义后,可能不会自动更新所有调用该函数的地方,从而导致类型错误。

假设我们有一个 TypeScript 项目。在 schema.ts 文件中,定义了一个函数:

GPT plus 代充 只需 145function createSchema() { // 函数逻辑 } 

该函数在 main.ts 中被调用。现在,如果我们修改 schema.ts 中的函数,要求增加一个 verbose 布尔参数:

function createSchema(verbose: boolean) { // 函数逻辑 } 

Claude Code 可以轻松完成这个修改。但问题是,它不会自动去查找并更新项目中所有调用 createSchema 的地方。因此,main.ts 中的调用会因为缺少参数而立即产生类型错误。

这个问题的核心是 Claude Code 缺乏项目级的类型感知。我们的解决思路是:每当编辑 TypeScript 文件后,自动运行 TypeScript 编译器进行类型检查。如果发现错误,就将这些错误信息反馈给 Claude Code,提示它去修复。

具体步骤如下:

  1. 监听文件编辑操作。
  2. 编辑完成后,在后台执行命令 tsc --noEmit 进行类型检查。
  3. 捕获检查结果中的错误。
  4. 通过 postToolUse 钩子将错误信息发送回 Claude Code。
  5. Claude Code 接收到错误反馈后,尝试定位并修复问题。

启用这个钩子后,当再次要求 Claude Code 为 createSchema 函数添加 verbose 参数时,过程如下:

  1. Claude Code 修改 schema.ts 文件。
  2. 钩子触发,运行 tsc --noEmit
  3. 类型检查器发现 main.ts 中存在调用错误。
  4. 钩子将此错误信息反馈给 Claude Code。
  5. Claude Code 识别到错误,随后自动导航到 main.ts 文件,为函数调用添加上缺失的 verbose 参数。

核心概念:这个钩子不仅适用于 TypeScript,其思想可以推广到任何有类型检查器的语言,甚至可以通过运行测试套件来确保编辑没有破坏现有功能。


解决了类型同步问题后,我们来看一个在大型项目中更棘手的挑战:代码重复。特别是在具有清晰模块结构的项目中,我们希望复用现有代码,而不是创建功能相似的新代码。

假设项目有一个 src/queries/ 目录,专门存放所有数据库查询函数。其中,orderQueries.ts 文件里已经有一个函数 getPendingOrders,用于查找状态为“待处理”的订单。

当我们给 Claude Code 一个明确且聚焦的任务时,例如“在 main.ts 中打印所有待处理订单”,它能很好地工作:它会查看 queries 目录,发现现有的 getPendingOrders 函数并直接使用。

然而,如果将同样的需求包装在一个更复杂的任务中,情况就不同了。例如,给出任务:“编写一个 Slack 集成,每天向特定频道发送所有等待时间超过三天的待处理订单列表”。在这个更复杂的上下文中,Claude Code 可能会“失去焦点”,它可能:

  1. queries 目录下创建一个全新的文件(如 orderAlertsQueries.ts)。
  2. 在新文件中编写一个与 getPendingOrders 功能高度重叠的新查询函数(如 getOrdersPendingTooLong)。
  3. 这导致了代码重复,增加了维护成本。

为了解决这个问题,我们可以创建一个专门的钩子来监控对 src/queries/ 目录的更改。

以下是该钩子的工作流程:

  1. 触发条件:每当 Claude Code 试图在 queries 目录中创建、编辑文件或使用多编辑工具时,钩子被触发。
  2. 启动审查:钩子会程序化地启动一个全新的、独立的 Claude Code 实例
  3. 执行分析:我们向这个新实例提供一个精心设计的提示词,要求它:
    • 分析刚刚做出的更改。
    • 审查 queries 目录中现有的所有代码。
    • 判断新增的查询是否与现有查询在功能上重复。
  4. 提供反馈:如果独立 Claude Code 实例认为存在重复,它会生成一份报告,指出可以复用的现有函数。
  5. 主实例响应:钩子将此报告通过 postToolUse 反馈给最初与我们交互的主 Claude Code 实例。主实例接收到建议后,通常会采纳,并修改其计划——例如,删除新建的重复文件,转而去修改现有的 getPendingOrders 函数以满足新需求。

核心代码逻辑(伪代码)

GPT plus 代充 只需 145if (change.isInDirectory(‘src/queries’)) } 

这个钩子带来了明显的益处:显著减少了核心目录中的代码重复,保持了代码库的整洁。然而,它也有代价:

  • 性能开销:每次监控目录的编辑都会启动一个新的 Claude Code 实例进行分析,增加了时间和计算成本。
  • 复杂性:实现和调试此类钩子需要更多精力。

因此,建议采取折中策略:不要在所有目录上都启用此类钩子,而是只将其应用于最关键、最需要保持纯净的少数目录(如 src/queries/, src/utils/),以最小化额外开销。


本节课我们一起学习了两种增强 Claude Code 的实用钩子。

  1. 类型检查钩子:通过在编辑后自动运行类型检查器(如 tsc),并将错误反馈给 Claude,我们解决了跨文件类型更新不同步的问题,确保了代码的类型安全。
  2. 防止重复钩子:通过程序化启动独立 Claude 实例对特定目录(如查询目录)的更改进行审查,我们能够有效防止功能重复代码的产生,鼓励代码复用,提升了大型项目代码库的可维护性。

这两种钩子体现了“引导式AI协作”的思想:我们不是完全依赖AI,而是通过设计巧妙的自动化流程,为AI提供必要的上下文和即时反馈,从而将其引导至更优的工作路径上。你可以根据自己项目的具体需求,借鉴这些思路来设计和实现自定义的钩子。

在本节课中,我们将学习如何使用 Claude Code SDK,以编程方式调用 Claude 的强大功能,并将其集成到你的工作流和工具链中。

上一节我们介绍了查询审查钩子,并初步接触了 Claude Code SDK。本节中,我们将深入了解这个 SDK 的具体用法和配置。

Claude Code SDK 允许你以编程方式使用 Claude Code。你可以通过 TypeScript 库或 Python 库来使用它。这个 SDK 与你已经在终端中使用的 Claude Code 完全相同,拥有所有相同的工具,我们可以利用它们来完成给定的任务。

SDK 作为大型管道或工具的一部分最为有用,正如我们之前在钩子中看到的那样。你可以轻松地将 Claude Code 作为大型流程的一部分,为某些特定工作流注入大量智能。

现在,我想通过将其添加到我们现有项目中的方式,为你快速演示 TypeScript SDK 的用法。

回到我的编辑器,我将在根项目目录中找到 sdk.ts 文件。在这里,我准备了一些代码来帮助我们开始使用 SDK。

我将更新顶部的提示词,要求 Claude 在 src/queries 目录中查找重复的查询。然后,我将保存这个文件并运行它。我会打开终端并执行 npm run sdk

这不是一个内置命令,它只是在后台将这个文件作为一个普通的 TypeScript 文件执行。我为我们准备了这个快捷方式,以便更轻松地运行 TypeScript 文件。

当我们运行它时,我们将看到本地 Claude Code 副本与 Claude 语言模型之间逐条消息的原始对话。最终,我们会返回到命令行。打印出的最后一条消息将包含来自 Claude 的最终响应。

SDK 有一个需要注意的地方:默认情况下,它只拥有读取权限。换句话说,它只能读取文件、目录,执行 grep 操作等。它不具备写入、编辑或创建文件等能力。

以下是授予写入权限的两种方法:

  • 你可以手动在查询调用中添加写入权限。
  • 或者,你也可以在 .claude 目录下的设置文件中添加一些权限设置。

让我演示一下如何允许 SDK 在此项目中使用编辑工具。

我将找到此处的提示词参数,紧随其后,我将添加 options,放入一个对象。tools 将是一个数组,我会放入 edit

然后,我将更新顶部的提示词,要求它为 package.json 文件添加一个描述。

现在,我将保存并再次运行 npm run sdk。完成后,我可以打开 package.json 文件,我将看到它确实添加了描述,所以现在它肯定具备了编辑文件的能力。

本节课中,我们一起学习了 Claude Code SDK 的集成与使用方法。正如前面提到的,Claude Code SDK 作为其他工具的一部分最为有用。因此,我鼓励你思考在自己的项目中,如何在辅助命令、脚本,或者最显著的是在钩子中使用它的机会。

在本节课中,我们将对之前学习的内容进行总结,并为你提供一些实用的后续学习建议和行动方向。

上一节我们深入探讨了 Claude Code 的各种高级功能。现在,让我们对整个课程进行回顾,并规划未来的学习路径。

首先,请记住 Claude Code 正处于持续变化和积极开发的阶段。你需要密切关注其官方主页,以获取最新的功能和技术更新。官方主页地址已在课程中提供。

以下是三个帮助你继续深入学习和应用 Claude Code 的核心建议。

  • 关注官方动态:定期查看 Claude Code 的官方主页,留意新发布的特性和技术。
  • 跟踪开发进展:了解工具的最新变化,确保你的使用方法与**实践同步。

  • 尝试自定义命令:根据你的具体工作流程,编写一些自定义命令来提高效率。
  • 配置 claude_desktop_config.md 文件:在配置文件中添加额外的指令,以更精细地控制 Claude Code 的行为。
  • 探索更多 MCP 服务器:除了本课程介绍的之外,尝试使用其他模型上下文协议服务器,以扩展 Claude Code 的能力边界。

  • 利用 GitHub 集成:深入研究 Claude Code 的 GitHub 集成功能。
  • 识别可自动化任务:思考你日常工作中那些重复、常见的任务。
  • 设计自动化流程:构思如何基于 GitHub 仓库中发生的事件(如推送、合并请求等),将这些任务自动委托给 Claude 来处理。

本节课中,我们一起学习了如何总结 Claude Code 的应用知识,并制定了后续的探索计划。从保持对工具更新的关注,到动手实验进行个性化定制,再到利用集成功能实现工作流的自动化,这些都是将 Claude Code 融入你开发工作的关键步骤。

希望你能享受使用 Claude Code 的旅程,并让它成为你提升生产力的得力助手。

小讯
上一篇 2026-03-27 07:14
下一篇 2026-03-27 07:12

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/249627.html