Claude Code即是基础设施
Andrej Karpathy为围绕LLM代理生长出的东西创造了一个术语:爪子。那些让代理触及上下文窗口之外世界的钩子、脚本和编排系统。1大多数人把Claude Code当作一个带文件访问功能的聊天框。他们输入提示词,看着它编辑文件,然后继续做别的事。这种认知框架完全忽略了这个工具的本质。
Claude Code不是IDE功能,而是基础设施。把它当作前者还是后者,决定了AI辅助开发是停留在10%的生产力提升,还是突破到某种根本性的不同层次。
摘要
Claude Code暴露了17个生命周期事件,每个事件都可以通过Shell脚本挂钩,在每次工具调用之前、期间或之后触发。2将钩子堆叠成调度器,调度器堆叠成技能,技能堆叠成代理,代理堆叠成工作流,你就得到了一个介于你和模型之间的可编程层,它强制执行模型无法绕过的约束。我在两个月内构建了84个钩子、48个技能、19个代理,以及约15,000行编排代码。零框架。零外部依赖。全部用bash和JSON实现。最终成果是一个自主开发系统,能在我睡觉时编写、审查和交付代码。本文将解释其架构、为什么IDE框架会限制人们的思维,以及Remote Control让这套基础设施随时随地可用后发生了什么变化。
IDE框架是错误的
默认的心智模型:Claude Code是一个更智能的自动补全工具。你坐在终端前,给它任务,监督输出。这种模型将你的生产力上限锁定在你个人能监督的范围内。
基础设施心智模型:Claude Code是一个以LLM为内核的可编程运行时。模型执行的每一个操作都经过你控制的钩子。你定义的是策略,而非提示词。模型在你的基础设施中运行,就像Web服务器在nginx规则中运行一样。你不会坐在nginx前面输入请求。你配置它、部署它、监控它。
这个区别之所以重要,是因为基础设施具有复利效应。一个在bash命令中拦截凭据的钩子,保护着每一个会话、每一个代理、每一次自主运行。一个编码了你博客评估标准的技能,无论是你调用还是代理调用,都会一致地执行。一个审查代码安全性的代理,无论你是否在旁观看,都运行同样的检查。
Simon Willison围绕一个核心观察来定义当前时刻:编写代码现在很廉价。3没错。但没人愿意听的推论是:验证现在才是昂贵的部分。没有验证基础设施的廉价代码只会大规模地产生bug。真正有回报的投资不是更好的提示词,而是模型周围那个能捕捉模型遗漏的系统。
基础设施层
Claude Code的钩子系统在17个生命周期事件上触发Shell命令。2PreToolUse在工具执行前触发,可以阻止它。PostToolUse在执行后触发,可以提供反馈。UserPromptSubmit在你输入时触发,可以注入上下文。Stop在模型尝试结束时触发,可以强制它继续工作。每个事件通过stdin接收JSON数据,包含完整上下文:会话ID、工具名称、工具输入、当前工作目录。
钩子系统不是插件系统,而是事件驱动架构。区别在于:插件扩展工具的功能。事件让你能拦截、修改和控制工具执行的每一个操作。你成为了中间件。
钩子:确定性层
钩子是Shell脚本。它们不会被幻觉、甜言蜜语或提示词注入所绕过。模型想运行rm -rf /?一个10行的bash脚本会检查命令是否在黑名单中,在Shell看到之前就将其拒绝。模型试图读取.env?一个文件路径正则表达式会拦截Read工具调用。这一切都不需要模型的配合。无论模型是否愿意,钩子都会触发。
我在17种事件类型上运行84个钩子。其分布很能说明问题:35个执行判断(门控、守卫、验证器),49个处理自动化(注入器、日志记录器、追踪器)。这个比例最初是1:6。两个月的自主运行中不断出现问题,将其推至4:5。每一个判断钩子的存在,都是因为没有它时出了问题。一个代理提交了带有TODO注释的代码。一个代理运行了破坏性的git命令。一个代理将凭据路径泄露到了日志文件中。每次失败都催生了一个门控。
最大的教训:用调度器替代独立钩子。我曾有七个钩子同时在UserPromptSubmit上触发,每个独立读取stdin,其中两个写入同一个JSON状态文件。并发写入截断了JSON数据。所有解析该文件的下游钩子全部崩溃。每个事件使用一个调度器,从缓存的stdin中顺序运行钩子,解决了这个问题。隐性开销,每次提示200毫秒。
技能:知识层
技能是按需或通过钩子激活的markdown指令集。4每个技能编码了模型在被调用时可以利用的领域专业知识。我的blog-evaluator技能定义了一个6类别加权评分标准,包含具体的评分准则、类别最低分和相互依赖关系。我的jiro技能编码了一个7步质量循环,配有证据门控,要求每个标准都提供具体证明。
技能与钩子组合使用。一个技能可以在frontmatter中定义自己的钩子,这些钩子仅在该技能运行期间激活。哲学类技能通过SessionStart钩子自动激活,将质量约束注入每个会话,无需显式调用。
48个技能涵盖:代码质量(jiro、testing-philosophy、debugging-philosophy)、内容(blog-writer-core、blog-evaluator、citation-verifier)、架构(fastapi、swiftui、database、htmx-alpine)、运维(deploy、cache、analytics、security),以及元编排(deliberation、scan-intel、ralph)。对Claude Code自身偏好的研究发现,它倾向于特定的框架和模式。9技能让你能用自己的选择覆盖这些默认偏好。
代理:委托层
代理是具有隔离上下文窗口的专用子代理。5每个代理获得一个专注的任务和全新的上下文。我的代码审查系统并行启动三个代理:正确性、安全性和规范性。每个代理独立审查。审查者之间的分歧恰恰揭示了单个审查者会遗漏的问题。
关键约束:递归守卫。一个Shell脚本在每次Task工具调用前触发,检查共享状态文件中的生成深度计数器,如果深度超过阈值则阻止调用。没有它,代理会委托给代理,再委托给代理,每一层都在丢失上下文、消耗token。默认限制为3层。实际上,有用的工作发生在深度1(主代理加一个子代理)。超过2层通常意味着任务分解本身就有问题。
19个代理涵盖:开发(ios-developer、backend-architect)、审查(code-reviewer、security-reviewer、conventions-reviewer、yagni-reviewer)、探索(project-scout、code-explorer、code-architect),以及验证(test-runner、correctness-reviewer)。
Remote Control改变了格局
2026年2月25日,Anthropic发布了Remote Control:从任何浏览器或Claude移动应用连接到本地Claude Code会话的功能。6该功能在Hacker News上获得了531分和313条评论,其中大部分是关于bug的抱怨。这些抱怨是合理的。但这个功能仍然具有变革性。
原因如下。在Remote Control之前,我所描述的基础设施有两种模式:有监督(我盯着终端)或无监督(我走开并祈祷一切顺利)。两者都不理想。有监督将吞吐量限制在我的注意力跨度内。无监督则冒着模型做出无人纠正的错误决策的风险。
Remote Control创造了第三种模式:异步治理。我运行自主循环,在夜间处理包含多个故事的PRD。外部操作(git push、API调用、任何离开本机的操作)的审批提示会推送到我的手机。我可以在任何地方批准、拒绝或重定向。治理层保持不变。”代理需要审批”到”人类提供审批”之间的延迟,从”等我什么时候查看笔记本电脑”降低到”手机上10秒钟”。
审批流程与我钩子中的影响范围分类相辅相成。本地操作(文件写入、测试运行)自动批准。共享操作(git提交)发出警告。外部操作(推送、API调用、部署)交由人工审查。Remote Control将这个”交由人工”的路径从阻塞等待变成了异步通知。代理继续处理下一个故事,同时我审查上一个。
像Agent Multiplexer这样的工具已经通过tmux管理Claude Code会话。10开源替代方案如Emdash提供完整的代理开发环境。11那些建议用SSH加tmux作为替代方案的人说得没错,它确实可以实现终端访问。但这些都没有审批路由功能。审批路由才是让无人值守操作变得安全——而不仅仅是可能——的关键。
成本即架构
“通过CLI降低MCP成本”一文(304 HN分)记录了一种模式:将MCP工具调用包装在CLI调用中,以避免维护MCP服务器连接的开销。7更深层的洞见是,成本是架构决策,而非运营事后考虑。
我的基础设施在三个层面处理成本:
Token层面。 系统提示词压缩。我在一个CLAUDE.md文件和8个规则文件中运行约3,500个token的系统提示词。高回报的精简:移除教程代码示例(模型已经知道这些API),合并文件间重复的规则,用约束替代解释。”拒绝匹配敏感路径的工具调用”与一段15行的解释为什么不应该读取凭据做的是同样的事。语义密度优于原始压缩。8
代理层面。 用全新启动替代长对话。自主运行中的每个故事都会获得一个具有干净上下文窗口的新代理。启动时,代理收到一份简报:当前git状态、前序代理完成了什么、它需要做什么。简报而非记忆。模型执行清晰简报的效果优于在30步累积上下文中导航。上下文永远不会膨胀,因为每个代理都是全新启动的。Geoffrey Huntley在”The Ralph Loop”中记录了类似的模式,使用Sonnet以每小时10.42美元的成本运行自主开发。13像OpenSwarm这样的多代理编排器则将工作者-审查者流水线与模型升级进行了形式化。14
架构层面。 无状态操作优先使用CLI而非MCP。一次性评估使用claude --print调用,成本更低且无连接开销。当工具需要持久状态或流式传输时,MCP服务器才有意义。Context Mode展示了反向方法:使用FTS5索引和BM25排名将315 KB的MCP输出压缩至5.4 KB。12两种方法都减少了token消耗,只是方向不同。我的大部分技能调用都是一次性的。我的提示词缓存分析发现,Claude Code CLI在超过4,096个token时默认缓存系统提示词。无需任何配置。
案例研究:84个钩子在实践中的样子
上周一次自主运行的具体会话追踪,处理一个包含5个故事的PRD:
-
SessionStart触发。调度器注入:当前日期、项目检测、哲学约束、系统性能检查、成本追踪初始化。五个钩子,总计180毫秒。 -
代理读取PRD,规划第一个故事。
UserPromptSubmit在内部提示上触发。调度器注入:活跃项目上下文、会话漂移基线(首次提示的Model2Vec嵌入,用于后续相似度检查)。120毫秒。 -
代理调用
Bash运行测试。PreToolUse:Bash触发。调度器运行:凭据检查(命令中无.env路径)、沙箱验证(命令不在黑名单中)、项目检测。90毫秒。测试运行。PostToolUse:Bash触发:活动心跳记录、基线漂移检查(余弦相似度0.63,远高于0.30阈值)。 -
代理调用
Write创建文件。PreToolUse:Write触发:文件范围检查(此路径是否在项目目录内?)。PostToolUse:Write触发:对写入文件进行lint检查、提交追踪、活动心跳。 -
代理完成故事。
Stop触发。质量门控钩子检查:代理是否为每个标准引用了证据?是否使用了模糊语言(”should”、”probably”)?diff中是否有TODO注释?如果任何检查失败,钩子返回exit 2,代理继续工作。 -
独立验证:一个全新代理运行测试套件,不信任前一个代理的自我报告。
-
三个代码审查代理并行启动。每个独立审查diff。发现结果合并。如果任何审查者标记了严重问题,故事将重新排队。
-
故事通过。加载下一个故事。循环对所有5个故事重复。
5个故事中触发的钩子总数:约340次。钩子总耗时:约12秒。这些隐性开销在一次夜间运行中阻止了三次凭据泄露、一次破坏性命令和两次不完整的实现。
核心要点
Claude Code是运行时,而非工具。 17个生命周期事件使其可编程。钩子、技能和代理是指令集。模型是执行引擎。你是系统架构师。
治理随自动化扩展。 每一个增加约束的钩子都降低了无人值守操作的风险。判断钩子与自动化钩子的比例就是你的安全裕度。我的比例是4:5,且仍在攀升。
基础设施有复利效应,提示词没有。 一个好的提示词改善一次交互。一个好的钩子改善每一次交互。一个好的技能改善每一个调用它的代理。一个好的代理改善每一个委托给它的工作流。投资于那个能产生乘数效应的层。
Remote Control让基础设施具备了便携性。 审批路由将”无监督”变成了”异步监督”。这个区别决定了你是寄希望于模型做出正确决策,还是验证它确实做到了。
成本是架构,而非优化。 全新代理启动、CLI优先调用、系统提示词压缩和提示词缓存,这些都是具有复利效应的结构性决策。事后优化的成本高于一开始就为之设计。
零框架依赖。 84个钩子、48个技能、19个代理,约15,000行编排代码。目录中的bash脚本。JSON状态文件。无运行时依赖。你可以采用一个钩子,也可以采用整个技术栈。基础设施从解决实际问题中有机成长,而非从实现别人的框架中产生。
本文是AI工程系列的一部分。上一篇:为什么我的AI代理有一套质量哲学。另请参阅:Thinking With Ten Brains和The Blind Judge。
-
Claude Code Hooks参考。Anthropic文档。17个生命周期事件,支持JSON输入/输出、匹配器模式和三种钩子类型(command、prompt、agent)。 ↩↩
-
Claude Code Skills参考。Anthropic文档。带有frontmatter元数据、允许工具和钩子定义的markdown指令集。 ↩
-
Claude Code Sub-agents参考。Anthropic文档。具有隔离上下文、worktree支持和模型选择的专用子代理。 ↩
-
Claude Code Remote Control。Anthropic文档。从任何设备继续本地会话。HN讨论(531分,313条评论)。 ↩
-
“通过CLI降低MCP成本。”thellimist的博客文章。HN讨论(304分,115条评论)。 ↩
-
“压缩你的Claude.md:削减60-70%的系统提示词冗余。”jchilcher的博客文章。HN讨论(24分,9条评论)。 ↩
-
“Claude Code的选择。”amplifying.ai的研究。对Claude Code工具和框架偏好的分析。HN讨论(39分,19条评论)。 ↩
-
Agent Multiplexer(amux)。GitHub。通过tmux管理Claude Code会话。HN讨论(13分)。 ↩
-
Context Mode:315 KB的MCP输出压缩至5.4 KB。GitHub。使用FTS5索引和BM25排名。HN讨论(77分,23条评论)。 ↩
-
Geoffrey Huntley,”The Ralph Loop。”ghuntley.com/loop。使用Sonnet以每小时10.42美元运行自主开发。 ↩
-
OpenSwarm:多代理Claude CLI编排器。GitHub。工作者-审查者流水线与模型升级。HN讨论(34分,18条评论)。 ↩