深入解构Claude Code - 第 9 篇 · 怎么给它加功能

这个助手的能力不是写死的。你可以用斜杠命令快速触发功能、用钩子在关键时刻插一脚、用插件装别人写的扩展、还能让它派"分身"并行干活。本篇讲这四种扩展方式。


9.1 / 开头的命令是怎么实现的:四十多个命令的统一做法

在输入框敲 /,会弹出一串命令:/clear(清空对话)、/compact(压缩)、/model(换模型)、/cost(看花了多少钱)......有四十多个。它们是怎么组织的?

每个命令是一个独立小包

每个命令是一个独立的小模块,住自己的文件夹,里面有:命令叫什么、干什么、怎么执行。这种"一个功能一个文件夹"的组织方式,好处是互不干扰------加新命令就是加个新文件夹,不用碰老代码。

统一的"命令"约定

每个命令按统一规矩描述自己:

  • 名字和说明(/help 列表里显示的);
  • 要不要参数(比如 /model sonnet 带模型名);
  • 什么时候可用(有的命令在特定模式下才出现);
  • 是"一次性动作"还是"打开一个界面"。

命令分两种长相:

  • 一次性命令 :敲下去执行一个动作就完事,比如 /clear 清空对话、/compact 触发压缩;
  • 带界面的命令 :敲下去打开一个全屏交互界面,比如 /model 弹出模型选择列表、/config 打开配置编辑器、装第三方应用的命令甚至是一个多步骤向导(一步步引导你点选)。

懒加载:不敲就不加载

四十多个命令的代码,不是启动时全部读进来的。如果全加载,光命令代码就拖慢启动。实际做法是:启动时只登记"有哪些命令、各叫什么"(很轻),你真的敲了某个命令,才去加载那个命令的代码并执行

这和第 4 篇"工具按需加载"、第 2 篇"快速通道"是同一种思想:轻装启动,用到才加载

命令怎么被识别和分发

你输入内容后,有个"命令中心"先判断:这是不是 / 开头?是的话解析出命令名和参数,找到对应模块,加载并执行;不是的话就当作普通对话交给核心循环。斜杠命令在对话里有特殊地位------它不是发给模型的话,而是给程序的指令。

排队执行

命令也会进第 3 篇讲的消息队列:模型正在干活时你敲了个命令,命令会排队,等当前这圈转完再执行,避免打断。

给"已搬走"的命令留个路标

有些老命令后来被改成插件形式提供了。为了不让老用户敲老命令时一脸懵,项目会留一个"路标牌":你敲老命令,它提示"这个功能现在在某某插件里",而不是冷冰冰地报"未知命令"。这是个很贴心的兼容性设计。


9.2 关键时刻插一脚:怎么让它每次改完文件都自动跑测试

斜杠命令是"人主动触发"的。但有些事你希望在特定时机自动发生------每次改完文件自动跑测试、每次提交前自动检查、AI 每次开口前先记录日志。这靠**钩子(hooks)**机制。

钩子是什么

钩子就是"在程序生命周期的固定节点上,允许你插入自己要执行的动作"。程序在这些节点上会停下来问一句:"这里有没有人挂了动作?有就执行。"

打个比方:钩子像流水线旁边的"工位"。流水线在固定位置留了接口,你可以在"零件组装完"这个工位挂一个质检动作,零件每次流到这里就自动质检。你不用改造流水线本身,只要把动作挂到对应工位上。

有哪些挂载点

程序在这些关键节点留了钩子:

  • 工具调用之前(PreToolUse):能审查甚至拦下这次调用;
  • 工具调用之后(PostToolUse):拿到结果后做点什么(比如改完文件自动跑测试);
  • 用户提交消息时(UserPromptSubmit):消息发给模型前做点什么;
  • 会话开始 / 结束;
  • 模型回复之后(PostModelQuery);
  • 停止时(Stop / 子助手停止):模型说"我干完了"时触发;
  • 压缩之前(PreCompact)。

钩子怎么配

钩子在配置文件里声明,通常指定:挂在哪个节点、匹配什么条件(比如"只在改文件工具之后")、执行什么动作(通常是跑一条命令,比如 npm test)。

钩子的动作可以是任意命令行命令,所以能力很灵活:跑测试、发通知、记日志、触发 CI、调用公司内部脚本......想干什么都行。

钩子能影响流程,不只是旁观

钩子不只是"看一眼",它可以实质影响流程:

  • 拦截:工具调用前的钩子可以说"这个不允许",于是工具不执行(相当于自定义了一条权限规则);
  • 补充:钩子可以往上下文里加内容(比如每次对话前自动把最新的接口文档塞进去);
  • 叫停:停止钩子可以说"先别停,还有个测试没过,继续修"------于是模型会接着干。

钩子和权限、插件的关系

  • 钩子 vs 权限关卡(第 4 篇):权限关卡管"这个操作允不允许",钩子更通用,能在任何节点挂任何动作;"工具调用前拦截"这个钩子和权限关卡有重叠,实际上权限系统可以看作一种特殊的、内置的钩子。
  • 钩子可以由用户自己配,也可以由插件(9.3)带来------插件能在挂载点上挂它自己的动作。

9.3 插件:别人写的扩展怎么装、凭什么信任

斜杠命令和钩子是"你自己一个个配"。插件则是打包好的一整套扩展------别人(或官方)把命令、工具、钩子、界面主题、子助手打包在一起,你一键安装就能用。

插件能包含什么

一个插件就是一个符合约定的包,里面可以有:

  • 新的斜杠命令;
  • 新的工具(第 4 篇讲的工具,装上后模型就能用);
  • 新的钩子(自动在某些节点做事);
  • 新的子助手类型(9.4 讲);
  • 界面主题、输出风格等。

插件通过一个"清单文件"声明自己带来了什么,程序读清单后把这些能力注册进系统------工具进工具箱、命令进命令列表、钩子挂上挂载点。

从哪装:插件市场

插件可以来自:

  • 本地文件夹(你自己写的);
  • 插件市场(类似应用商店,集中浏览、搜索、安装别人发布的插件);
  • 官方内置的一些插件。

装插件有完整的浏览/安装/更新/卸载流程,界面上能看到每个插件带来了什么、开关哪些能力。

信任问题:凭什么让插件在你电脑上跑

插件能跑命令、能加工具、能读你的文件------这是很大的权力,所以信任是核心问题:

  • 首次安装要确认:装一个新插件时,程序会明确警告"这个插件能做这些事,你信任它吗",你确认了才装;
  • 信任记录:信任过的插件记下来,不会每次都问;没确认的插件代码不会被加载执行;
  • 隔离执行:插件代码在受限环境里运行,不能为所欲为;
  • 来源管控:企业可以限制只能装官方/内部市场的插件(和第 7 篇外部服务的五层级配置、白名单是同一套管控思路)。

热重载

开发插件时不用反复重启程序:有"重新加载插件"的命令,改完插件代码一键重新读取,方便调试。

加载策略:先读清单,不急着实例化

和命令、工具一样,插件也是"轻装"加载:启动时只读所有插件的清单(知道装了哪些插件、各自带来什么),不真正执行插件代码;等真要用到某个插件的工具/命令时,才把它的代码加载进来。清单加载很快,实例化留到需要时。


9.4 派小弟:它怎么复制一个"自己"去并行干活

这是最能体现"智能体"威力的扩展能力:助手可以派一个"分身"(子助手 / subagent)去独立完成子任务。第 4 篇在工具里提到过它,这一章讲清楚机制。

为什么需要分身

设想一个任务:"把这个代码库里所有和登录有关的代码摸清楚。"主助手如果自己干,要读几十个文件,过程中会产生海量的工具调用和文件内容,全塞进主对话------聊天记录被这些探索过程撑爆,而且大部分细节(读了哪个无关文件、哪条路走岔了)对最终结论毫无价值。

派分身去做就干净了:

scss 复制代码
主助手:(调用"派分身"工具)给我摸清登录相关代码
   ↓
分身:(独立地跑一整套核心循环)
   读文件 A、搜索、读文件 B、走错路、折返、读文件 C......
   (这几十轮探索过程,全在分身自己的对话记录里)
   ↓
分身:(干完)汇报结论:
   "登录逻辑在 auth.ts、session.ts、middleware.ts 三个文件,
    入口是 login() 函数,权限校验走 checkAuth()。"
   ↓
主对话里只多出这一段结论。干净。

分身是"跑着同款发动机的独立实例"

关键认知:分身不是一个简化版脚本,它内部跑的就是第 3 篇那台完整的发动机(核心循环)------它有自己的系统提示、自己的聊天记录、自己的一套工具、自己转自己的圈。它和主助手的区别仅仅是:

  • 它是被主助手用工具"派"出来的;
  • 它的对话记录独立,不进入主对话;
  • 它干完只把最终结论汇报回来。

这就是为什么第 3 篇反复强调"核心循环要做成不关心谁在用它的纯发动机"------主助手、分身、被程序调用、被编辑器调用,跑的都是同一台发动机。

分身有不同"工种"

不是所有分身都一个样。可以定义不同类型的分身,各有专长和权限:

  • 探索分身:只做调查研究,工具是只读的(读文件、搜索),不许改东西,专心"摸清情况";
  • 计划分身:专门做方案规划,产出计划不动手;
  • 通用分身:能干完整的活,包括改文件;
  • 用户/插件还可以自定义分身类型(用一段说明文字定义"这个分身是干什么的、什么风格、能用哪些工具")。

主助手根据任务挑合适的分身:要调查就派只读的探索分身(安全、不会乱动),要完整实现一个功能就派通用分身。

并行与管理

  • 可以同时派多个分身并行干活(比如三个分身分别调查三个模块),它们之间互不干扰,各有各的记录;
  • 每个分身在界面上有独立的状态显示(不同颜色、名字,方便区分谁在干什么);
  • 分身可以后台跑,主对话不被阻塞,你能看到"分身 A 正在搜索......分身 B 正在读文件";
  • 分身理论上还能再派分身(嵌套),但通常会限制层级,防止无限套娃。

分身的记忆和主对话的关系

分身开始任务时,主助手会把"你要干什么、相关背景"作为任务说明交给它;分身执行中如果需要主对话才知道的信息,会通过任务说明传入或在结论里追问。分身探索到的结论回到主对话后,主助手再基于这些结论继续决策或动手。

这是一种"分而治之"的工作方式:主助手像项目经理,把大任务拆成小块、分派给专门的分身、收齐结论、做最终决策和整合。既保护了主对话的上下文不被探索过程淹没,又能并行提速。


本篇小结

  • 斜杠命令:四十多个独立小包,统一约定描述自己,启动只登记、用到才加载;分一次性动作和打开界面两种;命令排队执行,老命令搬走会留路标。
  • 钩子:在程序生命周期的固定节点(工具前后、提交时、停止时、压缩前......)挂自定义动作,能跑任意命令、能拦截/补充/叫停流程,是比权限关卡更通用的扩展点。
  • 插件:打包好的一整套扩展(命令+工具+钩子+主题+分身),从市场或本地安装;信任是核心------首次安装确认、记录信任、隔离执行、企业可管控来源;清单先加载、代码用到才实例化。
  • 子助手:主助手用工具派"分身",分身内部跑同款核心循环、有独立对话记录、只回传最终结论;分探索/计划/通用等工种,可并行、可后台、有限嵌套;本质是"分而治之",保护主对话上下文不被探索过程淹没。

下一篇讲高级能力:后台常驻、自主模式、各种工作模式、语音和看屏幕。

相关推荐
小磊哥er1 小时前
深入解构Claude Code - 第 8 篇 · 数据放哪、钱怎么算
javascript·ai编程
plainGeekDev2 小时前
Agent 技术调研自动化
agent·ai编程·claude
kyriewen3 小时前
我装了30多个Skill,给AI安排了8个岗位
前端·javascript·ai编程
魔术师Grace3 小时前
模型查资料、会做事、还省成本,分别靠什么?
aigc·agent·ai编程
AI编程实验室5 小时前
Agent Handoff v0.6.0 跨电脑同步:Git、EVENTS.jsonl、CONTEXT.md 使用方法
ai编程
殷紫川5 小时前
Hy4 Preview 与 Hy3:从 295B 到 770B,腾讯混元的架构跃迁与生产力落地
ai编程
ServBay5 小时前
Claude Code 插件别瞎装,这 9 款才是 2026 年的真生产力工具
aigc·ai编程·claude
zhangfeng11335 小时前
CodeBuddy‑CLI:启动自动授权 + 继续上次对话 codebuddy -c --permission-mode acceptEdits
ai编程
plainGeekDev6 小时前
Agent调试、错误处理与成本优化
agent·ai编程·claude