功能一个接一个地发:CLAUDE.md、技能、钩子、插件、子代理,最近又多了一个 Agent Teams。文档把每个都讲得很清楚,唯独不讲一件事——同一个活儿,我到底该用哪个。
这门课给了一个能收住全部功能的判断:它们回答的是同一道题,这段上下文该不该进主线程,进去之后要不要回来。CLAUDE.md 是永远在,技能是用到才进,子代理是进了不回来,Agent Teams 是进了还互相说话。选错了不会报错,只会变慢、变贵、变得答非所问。
讲课的是 Anthropic Claude Code 团队的 Lydia Hallie,2026 年 4 月 21 日在 FrontendMasters 的一场六十二分钟深度课,全程真机演示。本文按录像逐帧核过一遍,顺手订正了几处流传版本里走样的地方:主讲人身份、技能和子代理的落盘路径、插件清单的真实结构,以及那条被写成两个词的命令。
先摆正一个前提:Claude Code 不是一个命令行工具,它是一个可以被放到不同地方的智能体。终端、编辑器扩展、浏览器、桌面应用,都是它的落脚点。

四种形态的区别只在模型跑在哪儿:桌面和命令行跑在你本地,网页版更适合"仓库已经在托管平台上、想直接连上去改"的场景。这门课全程用命令行演示,但你在任何一端都能跟着做。
01 先看清楚谁在一直占着上下文
课上第一个被打开的是 /context。这条命令把当前会话的上下文窗口拆成几项列出来,画面上是这样一组数:系统提示词 6.1k、系统工具 9.1k、技能 887、消息 5.5k,空余 945.5k,另有 33k 留给自动压缩。

这张图值得多看两眼,它一次性说明了两件事。
第一件,真正"一直在"的东西并不多。系统提示词和系统工具加起来一万五千多个 token,你改不动,只能接受。消息是你和模型的全部来回,此刻只占 0.5%。
第二件更关键,三个技能加起来只花了 887 个 token。画面下方列着它们的名字与开销:skill-creator 87、configure 57、access 54。一个技能正文动辄上百行,进上下文的却只有几十个 token——因为默认注入的只有名字和描述,正文要等模型决定调用它的那一刻才加载。
在这个背景下,CLAUDE.md 的位置就清楚了:它是唯一每一轮都被完整拼进提示词的文件。它的体积不是一次性成本,是复利。
拿到一个已有项目,生成它最省事的办法是 /init。这条命令让 Claude Code 自己去翻代码库,把约定和结构摸清楚再落成文件。

这里有个常被问到的选择:/init 要不要用最贵的模型?课上的回答很干脆,Sonnet 就够,因为答案本来就在代码里,这不是一个需要批判性思考的深度任务,是一次事实抄录。演示机上跑的正是 Sonnet 4.6。
生成结果的质量确实不错。演示项目是一个看板式的问题追踪器,/init 写出来的文件里有项目概览、技术栈、全部可用命令、目录结构,一路写到第 140 行还在列 API 契约表格,连拖拽用 4 像素触发距离防误拖这种细节都记下来了。
但"写得全"和"值得留"是两回事。课上给的工作流是反过来的:先尽量删,删到最少,然后观察模型在哪里犯错、在哪里理解偏了,再把那部分补回去。因为整份文件都会进提示词、都会烧配额,一份大而无用的 CLAUDE.md 只是在加速消耗你的额度。
它的收益也随模型变化。早几代模型对意图的把握弱,CLAUDE.md 的作用格外突出;模型越聪明,同样一份文件的边际收益越低。多项目仓库按层级取用,从哪个目录启动就用哪一份,往上逐级回退,项目级共享的写进项目里,只属于你自己的偏好放到用户目录。
02 Plan Mode 的真身,是一句被自动补上的话
在动手实现之前先规划,这件事有两种做法。快捷键切换是一种,直接在提示词里写"先别写代码,说说你的想法"是另一种。

两种做法等价,因为 Plan Mode 在底层做的事就是往提示词里附加一条指令。知道这一点,你在任何入口都能拿到同样的效果,不必去记快捷键。
真正决定规划质量的不是模式,是你给了它什么可以对照的东西。课上演示的任务是"把界面做好看",而这句话对模型来说几乎没有信息量。解法是把"好看"换成一个能看的东西。

这张设计稿是一句提示词加一张丑界面的截图换来的。它给出的不只是画面,还有一套可执行的设计说明:暗色底、面板与描边各自的色值、主操作用一个紫色、每列用不同色相区分身份、界面字体与计数字体分开。
接下来是这门课里最该抄走的动作:把验证物放进循环里。做法朴素到有点好笑——把设计稿截图,拖进对话框,附一句"我想实现这个设计,你会怎么做?先别写代码,先给方案"。命令行里什么都渲染不出来,但模型读得懂图。
模型交回来的方案是这样的:

它先声明"这个设计需要在数据模型、后端和界面三层做出实质改动",然后开始列字段:自增的问题编号用来显示成 ISS-XXX、彩色标签、五档优先级并说明它驱动右上角那个图标、子任务完成数与总数对应卡片上的 0/4、评论计数。
这些字段没有一个是提示词里说过的,全是它从截图里读出来的。人贴图的时候没注意到,模型注意到了。
于是工程师的位置发生了移动:从写代码的人,变成审方案的人和产品经理。你要回答的问题只剩一个——这份方案是不是你想要的。不对就来回聊,像跟同事聊。
03 技能:把"每次都要解释一遍"的流程搬出去
CLAUDE.md 管默认行为,权限管禁止事项,两者都是被动的。当你发现自己在重复输入同一段多步流程时,那是技能该出场的信号。

技能就是一个 Markdown 文件,落在 .claude/skills/<名字>/SKILL.md,前面一段元信息,后面是步骤正文。画面上这个部署技能,正文就是九个步骤:拉主分支、装依赖跑测试、构建镜像、按提交号打标签、推到镜像仓库、更新集群、等待上线完成、跑健康检查、确认在正常服务流量。
写技能不必手写。内置的 skill-creator 会先反问你四个问题,把范围钉死。

四个问题分别是:
- 审什么:当前分支的改动、某个文件、整个合并请求,还是用户指哪儿审哪儿。
- 找什么:只找缺陷,还是连风格、安全、性能一起。
- 输出成什么样:逐行注释,还是一份要点清单。
- 有什么是它不该做的:比如跳过测试文件、不要顺手重构、不要挑格式的刺。
第四问最容易被忘掉,也最值钱。你不写,它就会在你不想要的地方发挥。
生成出来的成品,价值全压在描述这一栏。

正文只有一行"扫描 src 目录,把真问题挑出来",描述却写满了三行,最后还列出五个触发短语。因为进入提示词的只有名字和描述,模型能不能在对的时机想起这个技能,全看描述写得够不够具体。课上原话是,第一次自动生成的那条描述质量挺差,这正是推荐用 skill-creator 的理由。
模型会不会主动调用,还取决于模型本身。课上说,用某个较早版本时经常配了一堆技能却一个都不调,得在提示词里明说。
新增技能之后要执行一次 /reload-plugins,否则识别不到。这里还踩了个坑值得记:第一次调用时跑起来的不是新技能,而是内置的同名命令——内置的 /review 是"审查一个合并请求",撞名了。改名成 code-reviewer 再重载才正常。
元信息那一栏能配的东西比想象中多。

这个部署技能只有五行元信息,却已经用掉两项能力:model: sonnet 让它无论当前会话跑在哪个模型上,调用时一律降到 Sonnet;$ARGUMENTS 让你能写 deploy staging 和 deploy production 两种用法。
其余几项按需取用:
- 禁止模型调用,它就退化成只有你能敲的斜杠命令。反过来关掉用户调用,它就只对模型开放。
- 权限那一项可以精确到只允许跑某一条命令,等于给单个技能单独授权。
- 钩子数组让某个钩子只在这个技能里生效。
- 还有一个只给模型看、不在界面上露出的"何时使用"字段,专门用来补充调用时机。
代价也在这里。技能正文支持在发给模型之前先执行 shell 命令,把输出注入进去——这对集成命令行工具很好用,但意味着别人安装你的技能,就是在自己机器上跑你的代码。团队分发场景下这是实打实的风险,所以后来专门加了一个开关可以禁掉它。
顺便厘清一组容易混的概念:技能不是工具调用,两者根本不在一个层面。工具调用是模型主动发出的请求,"我要读这个文件""我要改这一段",它是模型跟系统交互的唯一途径——没有工具调用就没有智能体,只剩一个会说话的聊天机器人。技能面向的是使用者,它本质上是一包写好的提示词,让你不必反复输入同一段话、反复提醒模型注意什么。技能唯一超出提示词的能力,是能在元信息里声明一些提示词说不清的事,比如"这个技能必须在子代理里跑"。
还有一个容易被跳过的能力:skill-creator 能给技能跑评估。它在同一个代码库上分别启用和不启用这个技能各跑一遍,比较结果,最后出一份网页报告。这一步是用来回答"我新加的这个技能到底有没有让事情变好"——如果没有,它就只是在白白多烧 token。官方的技能仓库里带着这套评估脚本,可以直接抄。
课上给了一个明确的判断:行业的重心已经从提示词工程转向了技能工程。想保持竞争力,就去做几个真有用的技能,再通过插件分享出去。要选一个最该先做的场景,答案是问答式质量检查——这类流程天然是步骤化的,先做这一步再做那一步,写成技能最直接,还能配置成每次改动之后自动触发,简单场景用最小的模型跑都够。
04 钩子:整条链路上唯一不由模型决定的地方
前面所有机制,最终都是模型在决定要不要做。钩子不是。它在生命周期的固定位置触发,跟模型的想法无关。

这张图把可插入的位置全画了出来。会话启动在最外层,每一轮从用户提交提示词开始,进入智能体循环。循环内部依次是:工具调用前、权限请求、执行工具、工具调用后、子代理启动、任务创建、任务完成。循环收尾是停止或停止失败。再往外还有队友空闲、压缩前、压缩后、会话结束。
最值钱的两个位置是工具调用前和工具调用后。前者在模型已经决定调用、但还没真正执行的空档触发,你可以在这里追加判断、直接拦下来——一次工具调用可能对你的机器造成不小的影响,这道二次校验很有必要。后者在执行成功之后触发,格式化、静态检查这类收尾动作放这里最合适。
对照一下权限机制就更清楚了。下面这张图里,一条拒绝规则挡住了对 package.json 的修改:

模型撞上规则之后停下来,回过头问你两个选项:是把这条拒绝规则从配置里删掉,还是这一次单独批准。它拦得住,但它是等模型撞上来才生效的。钩子则是不管模型想什么,到点就跑。
实际配置一条并不难,直接写进设置文件,或者让 Claude 帮你写。

画面上这条的效果是:每次编辑或写入文件之后自动跑一遍类型检查,运行时在状态行显示"Running typecheck..."。/hooks 面板可以查看和禁用它——注意那个面板是只读的,它不负责创建钩子,要加要改得去改配置文件。课上顺口说了句这功能后续应该补上。
05 子代理:进去了就不回来的那一类
一次会话跑久了,上下文里会堆满工具返回值和零散代码片段。最初的任务可能只是"加一个按钮",而这些东西都在稀释模型对它的注意力。

子代理是一个独立的循环,有自己的上下文窗口、自己的工具集、自己的系统提示词。主代理把活儿派出去,它在隔离环境里跑完,只把结果交回来,中间过程一律不回写主会话。多个子代理可以同时开,各自返回,由主线程决定采纳谁。
内置的几个可以直接用,模型分配也说明了它们各自的定位:
| 内置子代理 | 模型 | 用途 |
|---|---|---|
| claude-code-guide | Haiku | 查 Claude Code 自身的文档 |
| Explore | Haiku | 在代码库里找东西,用得最多 |
| general-purpose | 继承主会话 | 通用任务 |
| Plan | 继承主会话 | 规划 |
| statusline-setup | Sonnet | 配置状态行 |
检索类任务用 Haiku 既合理又快,因为它不需要推理,只需要把信息找出来。这个搭配值得抄进你自己的自定义子代理里。
自建一个也就是几步的事。课上现场生成了一个代码审查子代理:落在 .claude/agents/code-reviewer.md,模型选 Sonnet,工具给全,记忆存在 .claude/agent-memory/ 下。生成的描述写得相当规整——"当代码被编写或修改、需要就质量、正确性和项目约定进行审查时使用本代理",后面还自动跟了一段示例场景。子代理和技能的分工就在这里:技能是给人省事的提示词包,子代理是一个带角色设定、独立跑的小工具,那种"你是一位资深代码审查员"的长篇系统提示词,应该写在子代理里而不是技能里。
它是怎么被自动派出去的?从模型的角度看,启动一个子代理跟调用一个工具没有区别——模型向外壳发出一次调用,外壳收到之后才真正把子代理拉起来。所以描述里那句触发条件写得准不准,直接决定它会不会在对的时候出场。
跑完之后回到主线程的,是这样一份东西:

两条严重问题都指到了具体行号。第一条,请求体被直接交给对象合并,客户端可以借此覆盖 id 和创建时间这类保留字段,修法是先解构出允许的字段再更新。第二条,状态值从未校验过类型,三个接口都接受任意字符串,其中重排序那个最危险,一次坏请求能把一整列的数据搞乱。
这就是子代理的全部产出:主对话不知道里面发生了什么,只拿到这段结论,用不用随你。
跑的过程也可以不占着你。让它转到后台,界面上能看到进度、已经烧掉多少 token、发了哪些工具调用,而主线程这边继续写代码、继续对话,互不影响;想中途叫停,有快捷键可以直接杀掉某一个。
默认情况下子代理不继承主对话的历史,它只从主代理那里拿到一段定制的系统提示词,里面有项目概览和这次要干的活——够它看懂代码库,但不是主代理知道的全部。如果你确实需要它带着前面聊过的内容开工,用分叉的方式启动,新分支会继承已有对话,同时仍然跑在子代理里。
代价相当具体。四月上线的 /usage 把账算给你看:

五条归因,条条都在说同一件事——你以为在并行,其实在烧配额。
- 98% 的用量发生在四个以上会话同时跑的时候。所有会话共享同一份额度,不必同时开就排队开。
- 90% 来自跑了三个以上子代理的会话。每个子代理都要自己重建一份上下文。
- 75% 发生在上下文超过 15 万 token 之后。长会话就算命中缓存也更贵。
- 19% 撞上了十万 token 以上的缓存未命中。通常发生在给一个已经闲置的会话发消息时。
- 12% 来自连续活跃八小时以上的会话。多半是后台任务或者循环任务。
子代理特别费 token 的根本原因就是那句"每次都从零重建基础上下文,没有可复用的缓存"。再叠上一条:如果描述写成"代码被写入或修改后需要审查",那么每一次文件编辑都可能触发它一次。所以给子代理挑模型这件事,本身就是省钱动作,代码审查这类活儿用小模型完全够。
想让一个技能也享受这种隔离,在它的元信息里加一行 context: fork 就行,它会被调度到一个全新的子代理上下文里跑,中间过程同样不污染主对话。
06 Agent Teams:让它们互相说话,代价是更多 token
课程录制前不久发布的 Agent Teams 乍看和子代理很像,都是主代理派活儿。区别在中间那一层。

左边是子代理:派出去、各干各的、各交各的结果,彼此之间没有任何连线。右边是 Agent Teams:主代理变成团队负责人,先建一份共享任务清单,队友们围着这份清单认领任务,队友与队友之间有双向的通信箭头。
这条差别带来的行为是可以观察到的。一个负责实现、一个负责审查,审查那个会说"我在等实现那边的结果";每一轮都对着清单校验完成情况,全部结束才终止整个流程。启用方式简单到不像话——跟 Claude Code 说"用五个智能体组成一个团队来跑这件事",它会自动创建角色并配好各自的系统提示词。
另一个实际差别是准备成本。普通子代理是项目结构的一部分,得在代码库里放对应的 Markdown 文件;队友是临时即时创建的,说一句就有,一个审查合并请求、一个做实现、一个管界面。
好处也很实在:子代理并行写同一个文件会撞出合并冲突,换成队友之后这种情况少得多,而且每个成员可以做得更专。课上还提到一个有意思的现象——团队负责人能察觉到队友进程退出,有时候会主动把闲太久的成员"辞退"。
但结论是克制的:大多数场景下这是杀鸡用牛刀。它消耗的 token 非常多,常规活儿用子代理就够,它更像一个锦上添花的能力。屏幕上几个面板互相对话、最后汇总出结果,观感确实接近某种通用智能,值不值得用是另一回事。
还有一个自指的坑:让团队内部互相检查,本质上是衔尾蛇。要真做质量把关,得引入一个独立的检查者。而你自己的审查入口是那份共享任务清单——先判断清单本身合不合理、准不准确,跑起来之后随时能看到谁开始偏航,也随时可以单独叫停某一个成员。
07 决定输出质量的,其实只有两件事
一堂课讲了六种机制,最后收在两句话上:任务启动前你给了多少上下文和多准的计划;循环里你放进去多少可以对照的验证物。设计任务就要求它出一张图,逻辑任务就让它跑一遍已有的测试。最终把关很多时候还是人做的,但验证嵌得越多,你需要亲自把关的部分就越少。
第一件事有个具体做法,是课上主讲人自己天天在用的:在规划阶段主动要求 Claude 反问你。

画面上这条提示词可以直接抄走:"我想做一个每个问题可以有多个负责人、有优先级之类的系统。用提问工具彻底采访我一遍,把我还没想到的边界情况都问出来。"
它会一个接一个地弹出问题,比如负责人该怎么识别、界面放在哪里。你可以跳过某一个,它继续问下一个。按退出键就整个终止,而之前答过的信息仍然保留,画面最后那行"用户拒绝回答问题"就是这么来的。
模型有时会自己触发这个工具,但不是每次规划都会。刻意要求一次的好处是不浪费对话回合,代价只是多写一句话。
第二件事是心态:把不同模型当成不同的同事,而不是同一个工具的不同档位。课上给的类比是,Opus 像团队里那个什么都懂、又特别乐意干活的资深工程师,Haiku 像一个很擅长执行重复任务的实习生。想清楚这一点,选模型这件事就不用纠结了。
顺带一条容易被忽略的运维事实:你的配置会过期。模型每次迭代都值得把 CLAUDE.md 和技能重看一遍。课上举的例子是,很多人在 CLAUDE.md 里堆满感叹号,"不要做这个!""要做这个!!"——那是因为上一代模型不总是遵守指令,而新版本在指令遵循上有了明显改进,这些感叹号就成了历史包袱。两个月前有效的配置今天多半还能用,只是不再是最优的。
课上顺手带过四个不起眼但很省事的小东西,一并记在这儿。/insights 生成一份网页版的个人使用报告,像是给 Claude Code 定制的性格测试,能看出自己擅长什么、哪里还有提升空间。/powerup 用来给新手做自我上手,带你把代码库走一遍。提示词里用 @ 提到某个文件,文件会被直接附进提示内容,省掉一整轮读取和查找的工具调用。课上就现场翻过车,没加 @ 的时候模型反问了一句"这个文件在哪"。最后,官方文档每周都会更新一页"新增了什么",配置该不该翻新,先去那页看看。
08 边界、代价,和明天可以先做的三件事
先说这门课里最诚实的一句:该用子代理还是工作树,这类问题没有标准答案,取决于太多因素。分享的内容不是最佳实践,很大程度上是在帮你建立自己的直觉——多跟它聊,看它擅长什么,找到适合自己的用法。
有几处边界是明确的:
工作树的代价是磁盘和时间。它在你的目录里创建一个指向不同分支的小型克隆,但依赖目录会跟着复制过去,体积很大,每建一个都得重装一遍依赖。课上明说这个体验不算好。
插件分发还很手动。清单文件是 .claude-plugin/plugin.json,里面写名字、描述、版本、作者,技能和钩子放在同级目录下一起打包。想进官方市场得提交表单走审核,没有类似包管理器那样的自动化流程。相比之下技能这边的生态更顺,已经有了一行命令加装某个技能的用法。
不想用官方命令行也有出路。Agent SDK 底层跑的是同一套运行时,拿一个密钥就能用代码把它接进自己的工具里,钩子在 SDK 侧既可以走配置文件,也可以写成回调函数直接传进去,返回一个带 block 决定的结果就能拦下这次调用。课上提到,官方自家的另一款产品内部同样跑在这套 SDK 上。
如果只想拿走三件事:
- 先跑一次
/context,看清楚现在到底是谁在占你的上下文,再决定 CLAUDE.md 该删到多短。 - 下一次进规划阶段,在提示词末尾加一句"用提问工具彻底采访我一遍,把我还没想到的边界情况都问出来"。
- 把你重复解释了三次以上的那个流程写成技能,描述里明确写上触发短语和"不该做什么"。
还有一处细节能说明这件事有多新。主讲人自己承认,以前做工作坊,所有练习都是确定的:题目固定、对错分明,每位参与者跑出来的结果一模一样。这一次不行,同一道题,每个人的 Claude Code 会给出不同的行为。所以课上给出的建议只有一句——自己动手跑一遍,看看会发生什么。
课上那句"看情况"听起来敷衍,但它和整堂课是自洽的:既然每个功能都在回答"这段上下文该不该进主线程",那答案当然取决于你手上这段上下文值不值钱。