<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Claude Code on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/claude-code/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 10 Jan 2026 15:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/claude-code/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>把 Claude Code 用成工程杠杆：落地心得</title>
      <link>https://ftmao.com/blog/posts/claude-code-engineering-practice/</link>
      <pubDate>Sat, 10 Jan 2026 15:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/claude-code-engineering-practice/</guid>
      <description>&lt;h1 id=&#34;把-claude-code-用成工程杠杆落地心得&#34;&gt;把 Claude Code 用成工程杠杆：落地心得&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;我做软件工程 18 年了，在华为和 IBM 做过电信级系统，近四年又一头扎进 AI 工程化，主导过 AI Agent 短视频生成平台和自动化口播剪辑平台。Claude Code 是我最近半年每天都在用的主力工具。它不是替代工程师的魔法，而是一把需要正确握持的杠杆。这篇文章聊聊我怎么把它落地到工程工作流里。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一先思考再输入&#34;&gt;一、先思考，再输入&lt;/h2&gt;
&lt;p&gt;很多人打开 Claude Code 的第一件事就是开始打字。这往往是最贵的错误。&lt;/p&gt;
&lt;p&gt;我现在的习惯是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写功能前，先想清楚模块边界、数据流、异常路径；&lt;/li&gt;
&lt;li&gt;重构前，先定义&amp;quot;目标形态&amp;quot;是什么；&lt;/li&gt;
&lt;li&gt;调试前，先列出我已知的事实和假设。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后按 &lt;code&gt;Shift+Tab&lt;/code&gt; 两次进入 &lt;strong&gt;Plan 模式&lt;/strong&gt;，把这些思考丢给 Claude。&lt;/p&gt;
&lt;p&gt;Plan 模式不是让 Claude 替我想，而是让它在我已经梳理好的框架里填充细节、发现盲点、提出反例。输入越清晰，输出越可用。这个道理听起来简单，但真正做到的人不多。&lt;/p&gt;
&lt;p&gt;如果你觉得自己还不具备独立想架构的能力，我的建议是：先从描述问题开始，和 Claude 反复对话，让它帮你把模糊的想法磨成可执行的方案。对话是双向的，不是单向许愿。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二架构描述决定代码质量&#34;&gt;二、架构描述决定代码质量&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;给我做一个认证系统&amp;rdquo; 和 &amp;ldquo;基于现有 User 模型实现邮箱密码登录，会话存 Redis 24 小时过期，给 /api/protected 加中间件&amp;rdquo;，得到的结果天差地别。&lt;/p&gt;
&lt;p&gt;AI 生成代码的问题，往往不在于模型不够聪明，而在于你给的目标太宽泛。自由度太大，模型就会按照它自己的理解去填补，而这些填补常常和你的工程习惯、团队规范、历史包袱不一致。&lt;/p&gt;
&lt;p&gt;我在方糖猫的项目里深有体会。AI Agent 的渲染流水线涉及 Java API 服务、Python Worker、RocketMQ、Remotion 渲染、FFmpeg 后处理多个环节。如果我只说&amp;quot;帮我实现一个视频生成任务调度&amp;quot;，Claude 可能会写出一个看起来合理但完全不符合我们现有架构的方案。但如果我把状态机、消息格式、失败重试策略、SSE 进度推送方式都描述清楚，它就能写出可以直接接入系统的代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好的 Prompt 不是文学，是需求文档的浓缩版。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三claudemd给-ai-的入职培训&#34;&gt;三、CLAUDE.md：给 AI 的入职培训&lt;/h2&gt;
&lt;p&gt;CLAUDE.md 是 Claude Code 会话启动时自动读取的文件。它的作用很像新员工入职手册，但比那更关键：因为它决定了 Claude 在你项目里的&amp;quot;默认行为&amp;quot;。&lt;/p&gt;
&lt;p&gt;我花了点时间打磨自己的 CLAUDE.md，几条原则：&lt;/p&gt;
&lt;h3 id=&#34;1-保持简短&#34;&gt;1. 保持简短&lt;/h3&gt;
&lt;p&gt;Claude 能稳定遵循的指令数量有限，系统提示已经占了一部分。写太多，它只会随机忽略。我的 CLAUDE.md 一般不超过两屏。&lt;/p&gt;
&lt;h3 id=&#34;2-只写项目特有信息&#34;&gt;2. 只写项目特有信息&lt;/h3&gt;
&lt;p&gt;不要解释&amp;quot;组件目录是什么&amp;quot;这种通用知识。要写真正影响决策的东西：关键 bash 命令、构建脚本、测试命令、提交规范、技术约束。&lt;/p&gt;
&lt;h3 id=&#34;3-写为什么不只是做什么&#34;&gt;3. 写&amp;quot;为什么&amp;quot;，不只是&amp;quot;做什么&amp;quot;&lt;/h3&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;差：&amp;ldquo;使用 Java 17&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;好：&amp;ldquo;使用 Java 17，因为部分依赖在 Java 21 下存在兼容性问题，计划在 Q4 统一升级。&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原因能让 Claude 在你没想到的地方做出正确判断。&lt;/p&gt;
&lt;h3 id=&#34;4-持续更新&#34;&gt;4. 持续更新&lt;/h3&gt;
&lt;p&gt;工作时长按 &lt;code&gt;#&lt;/code&gt; 键，Claude 会自动把指令写进 CLAUDE.md。我的标准是：当我第二次纠正同一个问题时，就把它固化为规则。&lt;/p&gt;
&lt;p&gt;坏的 CLAUDE.md 像写给新人的文档；好的 CLAUDE.md 像写给&amp;quot;未来失忆的自己&amp;quot;的笔记。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四上下文窗口不是越用越好&#34;&gt;四、上下文窗口不是越用越好&lt;/h2&gt;
&lt;p&gt;Opus 4.5 的上下文窗口很长，但很多人忽略了一个事实：&lt;strong&gt;上下文用到 20%–40% 时，输出质量就开始下降了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每次消息、每个文件、每段生成代码、每次工具输出都会累积。等会话变得臃肿，即使 &lt;code&gt;/compact&lt;/code&gt; 也救不回来，因为能力已经劣化了。&lt;/p&gt;
&lt;p&gt;我的做法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;每个任务一个会话&lt;/strong&gt;：不要在同一会话里既改认证系统又重构数据库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用外部记忆文件&lt;/strong&gt;：比如 &lt;code&gt;SCRATCHPAD.md&lt;/code&gt; 或 &lt;code&gt;plan.md&lt;/code&gt;，把中间结论落地到文件系统。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复制-压缩-清空-粘贴法&lt;/strong&gt;：重要信息复制出来，&lt;code&gt;/compact&lt;/code&gt; 总结，再 &lt;code&gt;/clear&lt;/code&gt;，只粘回关键内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知道何时清空&lt;/strong&gt;：会话一旦混乱，直接 &lt;code&gt;/clear&lt;/code&gt;。CLAUDE.md 还在，项目规则不会丢。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正确的心智模型是：&lt;strong&gt;把 Claude 当成无状态的&lt;/strong&gt;。状态应该由文件系统、版本控制、外部记忆来维护，而不是由会话历史来维护。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五提示词是沟通不是咒语&#34;&gt;五、提示词是沟通，不是咒语&lt;/h2&gt;
&lt;p&gt;我反复说的一句话是：提示词不是玄学，是沟通。清晰永远优于模糊。&lt;/p&gt;
&lt;p&gt;有效的提示通常包含三层：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;要做什么&lt;/strong&gt;：明确任务目标；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要做什么&lt;/strong&gt;：Claude 喜欢过度工程化，必须明确限制；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;约束和原因&lt;/strong&gt;：是原型还是生产代码？性能敏感还是可读性优先？为什么？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;比如我会这样写：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请为 &lt;code&gt;VideoRenderWorker&lt;/code&gt; 添加一个重试机制。要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;最多重试 3 次，使用指数退避；&lt;/li&gt;
&lt;li&gt;只对临时性错误重试，业务逻辑错误直接失败；&lt;/li&gt;
&lt;li&gt;不要引入新的依赖，使用现有的 Spring Retry 配置；&lt;/li&gt;
&lt;li&gt;这是生产代码，需要单元测试覆盖。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;这样的输入，输出基本可以直接进入 Code Review。&lt;/p&gt;
&lt;p&gt;另外记住：&lt;strong&gt;输出只来自输入&lt;/strong&gt;。如果你用好模型仍然得到坏结果，问题通常在你——你的提示写法、请求结构、上下文提供方式。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六模型路由让合适的模型做合适的事&#34;&gt;六、模型路由：让合适的模型做合适的事&lt;/h2&gt;
&lt;p&gt;Claude 的不同模型有明确的分工：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sonnet&lt;/strong&gt;：更快更便宜，适合执行明确的编码任务；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opus&lt;/strong&gt;：更慢更贵，适合复杂规划、架构设计、深度推理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我的常用模式是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 &lt;strong&gt;Opus&lt;/strong&gt; 做架构规划和复杂方案设计；&lt;/li&gt;
&lt;li&gt;用 &lt;strong&gt;Sonnet&lt;/strong&gt; 执行实现、补全代码、跑测试；&lt;/li&gt;
&lt;li&gt;用 &lt;strong&gt;CLAUDE.md&lt;/strong&gt; 保证模型切换后仍然遵循相同的项目规则。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这和团队里让资深架构师画蓝图、让工程师写代码是一个道理。Claude Code 里切换模型成本很低，但前提是你知道什么任务该用什么模型。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七mcphooksslash-命令与-skills&#34;&gt;七、MCP、Hooks、Slash 命令与 Skills&lt;/h2&gt;
&lt;p&gt;Claude Code 的工具生态值得花时间探索。除了前面提到的 MCP 和 Hooks，&lt;strong&gt;Skills（技能）&lt;/strong&gt; 是我最近用得越来越多的能力，它把常用工作流封装成可复用的指令包。&lt;/p&gt;
&lt;h3 id=&#34;1-mcphooks-和-slash-命令&#34;&gt;1. MCP、Hooks 和 Slash 命令&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP&lt;/strong&gt;：连接外部服务。如果你还在手动复制粘贴信息进 Claude，很可能 MCP 能帮你自动化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks&lt;/strong&gt;：在 Claude 修改代码前后执行操作，比如自动格式化、类型检查、跑 lint。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义 Slash 命令&lt;/strong&gt;：把常用的提示词模板化，避免每次重复输入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我在项目里配了几个常用 Slash 命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/review&lt;/code&gt;：让 Claude 按项目规范做 Code Review；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/test&lt;/code&gt;：为当前修改生成单元测试；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/doc&lt;/code&gt;：为新增接口补全文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-skills把个人经验变成团队能力&#34;&gt;2. Skills：把个人经验变成团队能力&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Skill 是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Skill 是一个 Markdown 文件（通常是 &lt;code&gt;SKILL.md&lt;/code&gt;），带有 YAML frontmatter。它描述了一个完整的工作流、判断标准或领域知识。Claude 会在合适的时机自动加载它，或者你可以通过 &lt;code&gt;/skill &amp;lt;name&amp;gt;&lt;/code&gt; 手动调用。&lt;/p&gt;
&lt;p&gt;你可以把 Skill 理解为&amp;quot;可插拔的专长&amp;quot;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; 是项目通用的&amp;quot;入职培训&amp;quot;，始终加载；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SKILL.md&lt;/code&gt; 是按需加载的&amp;quot;专项手册&amp;quot;，只在匹配的场景触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skill 放在哪里？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有两种常见位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;个人级&lt;/strong&gt;：&lt;code&gt;~/.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;，跨项目可用；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目级&lt;/strong&gt;：&lt;code&gt;.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;，跟随仓库走，团队成员共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我推荐项目级 Skill，因为团队规范应该和代码放在一起，而不是依赖每个人的本地配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个最小 SKILL.md 示例：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name: spring-api-review
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;description: 当用户请求对 Spring Boot API 代码进行 Review 时调用此 skill。
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# Spring Boot API Review 规范
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 检查项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;1.&lt;/span&gt; 控制器是否只做参数校验和调用服务层？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;2.&lt;/span&gt; 服务层是否处理业务逻辑，而不是直接操作 HTTP 上下文？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;3.&lt;/span&gt; DTO 是否有清晰的入参/出参边界？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;4.&lt;/span&gt; 异常是否统一处理，而不是在每个方法里 try-catch？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;5.&lt;/span&gt; 是否有对应的单元测试覆盖核心分支？
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## 输出格式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;对每个问题，按以下结构输出：
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 位置：文件路径 + 行号
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 问题描述
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;-&lt;/span&gt; 风险等级：高 / 中 / 低
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- 建议修改&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;&lt;code&gt;description&lt;/code&gt; 字段非常关键。Claude 会根据它判断何时自动加载这个 Skill。描述越具体，触发越准确。&lt;/p&gt;
&lt;h3 id=&#34;3-有哪些值得尝试的-skill&#34;&gt;3. 有哪些值得尝试的 Skill？&lt;/h3&gt;
&lt;p&gt;Claude Code 本身不内置大量固定 Skill，但社区已经沉淀了不少高质量 Skill 包。以下是我觉得对工程团队最有价值的几个方向：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Skill / Skill 包&lt;/th&gt;
					&lt;th&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;gstack&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;比较完整的一套工程 Skill 集合，覆盖 review、qa、investigate、ship、canary、retro 等&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/review&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;预着陆 PR 审查，检查 SQL 注入、LLM 信任边界、副作用等结构性问题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/qa&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;系统化 QA 测试，发现 bug 后自动修复并验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/investigate&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;系统性根因排查，要求&amp;quot;无根因不修复&amp;quot;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/ship&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;合并主分支、跑测试、生成 PR 的发布工作流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/canary&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;部署后监控异常、性能回归、页面失败&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;/retro&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;基于提交历史做工程复盘&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;heliohq/ship&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;更严格的分阶段流水线：spec → dev → E2E → review → QA → refactor → handoff&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Cavestack&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强调&amp;quot;Hero Six&amp;quot;核心 Skill，包括 office-hours、investigate、plan-eng-review 等&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我个人用得比较多的是 &lt;code&gt;/review&lt;/code&gt;、&lt;code&gt;/investigate&lt;/code&gt; 和 &lt;code&gt;/ship&lt;/code&gt;。它们不是替代人的判断，而是把重复性的检查清单和流程自动化，让我把精力放在真正需要决策的地方。&lt;/p&gt;
&lt;h3 id=&#34;4-怎么创建自己的-skill&#34;&gt;4. 怎么创建自己的 Skill？&lt;/h3&gt;
&lt;p&gt;创建 Skill 的步骤很简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;新建目录&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p .claude/skills/my-skill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;写 SKILL.md&lt;/strong&gt;：包含 name、description、用途、步骤、输出格式、示例和约束。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试触发&lt;/strong&gt;：开一个新会话，描述一个匹配的场景，看 Claude 是否自动加载。如果没加载，调整 description 让它更具体。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;迭代优化&lt;/strong&gt;：使用一段时间后，把新发现的问题和约束补充进去。和 CLAUDE.md 一样，Skill 也是需要持续维护的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我的建议是：不要一开始就写很多 Skill。先观察团队里哪些工作流是重复的、哪些判断标准是大家口头传颂的，把最常见的两三个固化成 Skill。质量比数量重要。&lt;/p&gt;
&lt;h3 id=&#34;5-skillclaudemdhooks-的分工&#34;&gt;5. Skill、CLAUDE.md、Hooks 的分工&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;能力&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
					&lt;th&gt;触发方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;CLAUDE.md&lt;/td&gt;
					&lt;td&gt;项目通用规则，始终加载&lt;/td&gt;
					&lt;td&gt;每次会话启动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;SKILL.md&lt;/td&gt;
					&lt;td&gt;专项工作流，按需加载&lt;/td&gt;
					&lt;td&gt;匹配描述时自动加载，或 &lt;code&gt;/skill&lt;/code&gt; 手动调用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Hooks&lt;/td&gt;
					&lt;td&gt;代码修改前后的强制检查&lt;/td&gt;
					&lt;td&gt;触发编辑操作时&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MCP&lt;/td&gt;
					&lt;td&gt;连接外部系统的能力&lt;/td&gt;
					&lt;td&gt;需要外部数据或操作时&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这几层叠加起来，才能把 Claude Code 从一个&amp;quot;聊天工具&amp;quot;变成符合团队工程规范的&amp;quot;协作系统&amp;quot;。&lt;/p&gt;
&lt;p&gt;这些小投入会不断复利。模型每周都在变好，但你的工具链、Skill 库和流程才是属于自己的护城河。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八当-claude-卡住时换策略&#34;&gt;八、当 Claude 卡住时，换策略&lt;/h2&gt;
&lt;p&gt;Claude 有时会陷入循环：改了 A 导致 B 错，改了 B 又导致 A 错。这时候继续补充说明往往没用。&lt;/p&gt;
&lt;p&gt;我常用的策略：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;清空会话&lt;/strong&gt;：从头开始，减少污染；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拆分任务&lt;/strong&gt;：把大问题拆成几个独立的小问题；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;给示例而不是解释&lt;/strong&gt;：&amp;ldquo;参考 &lt;code&gt;UserService.java&lt;/code&gt; 里的错误处理模式&amp;rdquo; 比 &amp;ldquo;请优雅地处理异常&amp;rdquo; 有效得多；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;换种表述方式&lt;/strong&gt;：同一个需求用不同结构说一遍，有时能绕过模型的固化模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关键技能不是让 Claude 永远不出错，而是&lt;strong&gt;尽早识别循环，并及时切换策略&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九构建系统而不是一次性工具&#34;&gt;九、构建系统，而不是一次性工具&lt;/h2&gt;
&lt;p&gt;Claude Code 最大的价值，不在于帮你完成单次任务，而在于把它嵌入工程系统。&lt;/p&gt;
&lt;p&gt;它支持 headless 模式（&lt;code&gt;-p&lt;/code&gt;），可以脚本化、自动化、串联命令。企业已经在用它做：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动审 PR；&lt;/li&gt;
&lt;li&gt;处理支持请求；&lt;/li&gt;
&lt;li&gt;更新文档；&lt;/li&gt;
&lt;li&gt;批量重构；&lt;/li&gt;
&lt;li&gt;生成测试用例。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们的飞轮是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude 出错 → 改进 CLAUDE.md 或工具链 → 下次更好。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;几个月后，即使模型没变，整个系统也会显著提升。这就是复利。&lt;/p&gt;
&lt;p&gt;如果你只把 Claude Code 当成一个交互式聊天工具，你正在浪费它的大部分价值。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十写给老工程师的话&#34;&gt;十、写给老工程师的话&lt;/h2&gt;
&lt;p&gt;用了 Claude Code 一段时间后，我发现一个有意思的现象：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经验丰富的工程师反而更容易用好它。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为你知道什么是好的架构，什么是坏的妥协，什么是可以自动化的重复劳动，什么是必须人工把关的关键决策。Claude Code 不会替你承担责任，但它能把你的判断力和工程经验放大很多倍。&lt;/p&gt;
&lt;p&gt;对我来说，它最大的帮助不是写代码更快，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把重复性工作交给它，我腾出时间思考架构；&lt;/li&gt;
&lt;li&gt;用它快速验证想法，减少原型阶段的沉没成本；&lt;/li&gt;
&lt;li&gt;通过 CLAUDE.md 和工具链，把个人经验沉淀为团队能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;把 Claude Code 用好，核心就几句话：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先思考，再输入；&lt;/li&gt;
&lt;li&gt;架构描述决定代码质量；&lt;/li&gt;
&lt;li&gt;CLAUDE.md 是杠杆点；&lt;/li&gt;
&lt;li&gt;上下文在用到 30% 时就开始劣化；&lt;/li&gt;
&lt;li&gt;提示词是沟通，输出来自输入；&lt;/li&gt;
&lt;li&gt;让 Opus 规划，让 Sonnet 执行；&lt;/li&gt;
&lt;li&gt;善用 MCP、Hooks、Slash 命令，更要善用 Skills；&lt;/li&gt;
&lt;li&gt;卡住时换策略；&lt;/li&gt;
&lt;li&gt;构建系统，而不是只做一次性任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现代 AI 工具已经强得离谱。你是在和工具对抗，还是顺势而行，往往取决于这些细节。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;我在 ftmao.com/blog 持续记录 AI 工程、Agent 设计与 Claude Code 等工具的落地实践，欢迎关注和交流。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    <item>
      <title>Claude Code 是怎么运行的？给新手的 AI 编程代理入门指南</title>
      <link>https://ftmao.com/blog/posts/claude-code-principles-for-beginners/</link>
      <pubDate>Fri, 09 Jan 2026 10:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/claude-code-principles-for-beginners/</guid>
      <description>&lt;h1 id=&#34;claude-code-是怎么运行的给新手的-ai-编程代理入门指南&#34;&gt;Claude Code 是怎么运行的？给新手的 AI 编程代理入门指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://github.com/shareAI-lab/learn-claude-code&#34;&gt;shareAI-lab/learn-claude-code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你有没有想过，为什么你跟 Claude Code 说“帮我改一下这个网页”，它就能自己打开文件、修改代码、运行测试，然后告诉你结果？&lt;/p&gt;
&lt;p&gt;它看起来好聪明，像人一样会“动手”。但其实，它背后的原理并不神秘，甚至可以用几十行简单的代码讲清楚。&lt;/p&gt;
&lt;p&gt;这篇文章是给新手的。不管你有没有学过编程，我都会尽量用生活中的例子来解释。读完之后，你会明白：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code 最核心的部分是什么；&lt;/li&gt;
&lt;li&gt;它是怎么“看懂”文件、“动手”改代码的；&lt;/li&gt;
&lt;li&gt;它为什么能记住很多事情、做错事能重来；&lt;/li&gt;
&lt;li&gt;以及如果你想自己做一个类似的 AI 助手，应该从哪里开始。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一一句话讲清楚-claude-code&#34;&gt;一、一句话讲清楚 Claude Code&lt;/h2&gt;
&lt;p&gt;如果把 Claude Code 拆开，你会发现它只有三个东西：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一个循环 + 一张工具表 + 一个会说话的 AI&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;部件&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
					&lt;th&gt;生活里的比喻&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;会说话的 AI（大语言模型）&lt;/td&gt;
					&lt;td&gt;思考、理解你说的话、决定下一步做什么&lt;/td&gt;
					&lt;td&gt;一个超级聪明的大脑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;工具表&lt;/td&gt;
					&lt;td&gt;让 AI 能读写文件、运行命令、搜索代码&lt;/td&gt;
					&lt;td&gt;给大脑装上双手和眼睛&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;循环&lt;/td&gt;
					&lt;td&gt;不断重复“思考 → 行动 → 看结果 → 再思考”&lt;/td&gt;
					&lt;td&gt;机器人一直干活，直到做完&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这个“循环”非常重要。没有它，AI 就只能说一次话，没法连续做很多事。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 工具箱[&amp;#34;🧰 工具箱（Harness）&amp;#34;]
        读文件[&amp;#34;读文件&amp;#34;]
        写文件[&amp;#34;写文件&amp;#34;]
        执行命令[&amp;#34;执行命令&amp;#34;]
        搜索[&amp;#34;搜索代码&amp;#34;]
        权限[&amp;#34;权限检查&amp;#34;]
    end

    大脑[&amp;#34;🧠 AI 大脑&amp;lt;br/&amp;gt;会思考、会推理&amp;#34;]
    电脑[&amp;#34;💻 你的电脑&amp;#34;]

    大脑 --&amp;gt;|我想读文件| 读文件
    读文件 --&amp;gt;|文件内容| 大脑
    大脑 --&amp;gt;|我想运行测试| 执行命令
    执行命令 --&amp;gt; 电脑
    电脑 --&amp;gt;|测试结果| 大脑
    权限 --&amp;gt;|这个能做吗？| 执行命令&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二最核心的-30-行代码&#34;&gt;二、最核心的 30 行代码&lt;/h2&gt;
&lt;p&gt;Claude Code 的心脏，是一段很简单的代码。你可以把它理解成“机器人干活的主流程”：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;agent_loop&lt;/span&gt;(query):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 先把用户的问题记下来&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    messages &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: query}]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 把对话历史发给 AI，告诉它有哪些工具可以用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        response &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;messages&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            model&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;MODEL,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            system&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;SYSTEM,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            messages&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;messages,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            tools&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;TOOLS,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            max_tokens&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 把 AI 的回复存进历史&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        messages&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append({&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: response&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;content})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 4. 如果 AI 不再调用工具，就说明它说完了，结束循环&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; response&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stop_reason &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 5. 执行 AI 要求的工具，并把结果告诉它&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        results &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; block &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; response&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;content:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; block&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;type &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                output &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; run_tool(block&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name, block&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;input)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                results&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_result&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tool_use_id&amp;#34;&lt;/span&gt;: block&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: output,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                })
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        messages&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append({&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: results})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;人话解释&#34;&gt;人话解释&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;你问了一个问题&lt;/strong&gt; → 比如“帮我修一下这个 bug”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 看历史和工具表&lt;/strong&gt; → 它想：“我需要先读一下代码文件。”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 说“我要用读文件工具”&lt;/strong&gt; → 程序真的去打开文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把文件内容还给 AI&lt;/strong&gt; → AI 再看，决定下一步。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一直重复，直到 AI 说“我搞定了”&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    开始([你输入任务]) --&amp;gt; 发给AI[把任务+历史发给 AI]
    发给AI --&amp;gt; AI思考[AI 思考]
    AI思考 --&amp;gt; 判断{AI 想调用工具吗？}
    判断 --&amp;gt;|想| 执行工具[程序执行工具]
    判断 --&amp;gt;|不想| 输出答案[输出最终答案]
    执行工具 --&amp;gt; 返回结果[把结果返回给 AI]
    返回结果 --&amp;gt; 发给AI
    输出答案 --&amp;gt; 结束([结束])&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三20-节课都在讲什么一张总图看懂&#34;&gt;三、20 节课都在讲什么？一张总图看懂&lt;/h2&gt;
&lt;p&gt;Claude Code 的学习资料里有 &lt;strong&gt;20 节课&lt;/strong&gt;，每节课加一个新能力。它们不是乱排的，而是像打游戏升级一样，一步一步变强。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 第一阶段[&amp;#34;🌱 第一阶段：让 AI 动起来&amp;#34;]
        s01[&amp;#34;s01 循环&amp;#34;]
        s02[&amp;#34;s02 工具&amp;#34;]
        s03[&amp;#34;s03 权限&amp;#34;]
        s04[&amp;#34;s04 钩子&amp;#34;]
    end

    subgraph 第二阶段[&amp;#34;🛠️ 第二阶段：做复杂任务&amp;#34;]
        s05[&amp;#34;s05 计划&amp;#34;]
        s06[&amp;#34;s06 子代理&amp;#34;]
        s07[&amp;#34;s07 技能&amp;#34;]
        s08[&amp;#34;s08 压缩记忆&amp;#34;]
    end

    subgraph 第三阶段[&amp;#34;🧠 第三阶段：记得住、错得了&amp;#34;]
        s09[&amp;#34;s09 记忆&amp;#34;]
        s10[&amp;#34;s10 系统提示&amp;#34;]
        s11[&amp;#34;s11 错误恢复&amp;#34;]
    end

    subgraph 第四阶段[&amp;#34;⏳ 第四阶段：长时间运行&amp;#34;]
        s12[&amp;#34;s12 任务图&amp;#34;]
        s13[&amp;#34;s13 后台任务&amp;#34;]
        s14[&amp;#34;s14 定时任务&amp;#34;]
    end

    subgraph 第五阶段[&amp;#34;👥 第五阶段：团队协作&amp;#34;]
        s15[&amp;#34;s15 队友&amp;#34;]
        s16[&amp;#34;s16 团队协议&amp;#34;]
        s17[&amp;#34;s17 自治&amp;#34;]
        s18[&amp;#34;s18 目录隔离&amp;#34;]
    end

    subgraph 第六阶段[&amp;#34;🔌 第六阶段：扩展组装&amp;#34;]
        s19[&amp;#34;s19 MCP 插件&amp;#34;]
        s20[&amp;#34;s20 完整系统&amp;#34;]
    end

    第一阶段 --&amp;gt; 第二阶段 --&amp;gt; 第三阶段 --&amp;gt; 第四阶段 --&amp;gt; 第五阶段 --&amp;gt; 第六阶段&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;下面拆解核心部分。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四第一阶段让-ai-动起来&#34;&gt;四、第一阶段：让 AI 动起来&lt;/h2&gt;
&lt;h3 id=&#34;s01-agent-loop一个循环就够了&#34;&gt;s01 Agent Loop：一个循环就够了&lt;/h3&gt;
&lt;p&gt;这是所有东西的基础。就像你骑自行车，核心是“踩踏板 → 车轮转 → 车前进”这个循环。Claude Code 的核心就是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AI 思考 → 调用工具 → 看结果 → 再思考 → 再调用工具 → …… → 完成&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;没有循环，AI 只能说一句话。有了循环，它就能连续做很多步。&lt;/p&gt;
&lt;h3 id=&#34;s02-tool-use从一把螺丝刀到整套工具箱&#34;&gt;s02 Tool Use：从一把螺丝刀到整套工具箱&lt;/h3&gt;
&lt;p&gt;最早的 AI 只有一个工具：执行终端命令（bash）。但这样很不方便，就像你修自行车只能用一个螺丝刀。&lt;/p&gt;
&lt;p&gt;后来 Claude Code 给 AI 配了一整套工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;read_file&lt;/code&gt;：读文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;write_file&lt;/code&gt;：写文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;edit_file&lt;/code&gt;：改文件中的一部分&lt;/li&gt;
&lt;li&gt;&lt;code&gt;glob&lt;/code&gt;：按名字找文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grep&lt;/code&gt;：在文件里搜索文字&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些工具是“分发表”管理的。程序不用写一堆 if/else，而是查一个字典：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TOOL_HANDLERS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read_file&amp;#34;&lt;/span&gt;:  read_file_function,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;write_file&amp;#34;&lt;/span&gt;: write_file_function,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;edit_file&amp;#34;&lt;/span&gt;:  edit_file_function,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# AI 说想用 read_file，就找到对应的函数执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;handler &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TOOL_HANDLERS[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read_file&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; handler(path&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main.py&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;好处&lt;/strong&gt;：加新工具就像往工具箱里多放一把扳手，不用改主流程。&lt;/p&gt;
&lt;h3 id=&#34;s03-permission先问能不能做再让它做&#34;&gt;s03 Permission：先问能不能做，再让它做&lt;/h3&gt;
&lt;p&gt;这是 Claude Code 很重要的一课：&lt;strong&gt;自由要有边界&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;AI 能力很强，但它不能想删啥就删啥、想改啥就改啥。权限系统就像家长给孩子定规矩：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读文件可以；&lt;/li&gt;
&lt;li&gt;修改重要文件要问一下；&lt;/li&gt;
&lt;li&gt;删除整个文件夹？不行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    AI想做事[AI 想执行命令] --&amp;gt; 查权限{权限系统检查}
    查权限 --&amp;gt;|允许| 直接执行
    查权限 --&amp;gt;|需要确认| 问用户[弹窗问用户]
    查权限 --&amp;gt;|禁止| 拒绝[拒绝执行]
    问用户 --&amp;gt;|同意| 直接执行
    问用户 --&amp;gt;|不同意| 拒绝&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这教会我们一个工程原则：&lt;strong&gt;先设边界，再给自由。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;s04-hooks在循环边上挂挂钩&#34;&gt;s04 Hooks：在循环边上挂“挂钩”&lt;/h3&gt;
&lt;p&gt;Hook 中文叫“钩子”。想象你在书包上挂很多小挂件：钥匙扣、饭卡、耳机。主书包不变，但你可以加东西。&lt;/p&gt;
&lt;p&gt;Claude Code 的 Hook 系统也是这样：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;工具执行前，可以检查一下（PreToolUse）；&lt;/li&gt;
&lt;li&gt;工具执行后，可以记录日志（PostToolUse）；&lt;/li&gt;
&lt;li&gt;会话开始/结束时，可以做初始化或清理。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    AI决定[AI 决定调用工具] --&amp;gt; 前钩子[&amp;#34;PreToolUse 钩子&amp;lt;br/&amp;gt;检查/拦截&amp;#34;]
    前钩子 --&amp;gt; 执行工具
    执行工具 --&amp;gt; 后钩子[&amp;#34;PostToolUse 钩子&amp;lt;br/&amp;gt;记录/通知&amp;#34;]
    后钩子 --&amp;gt; 返回AI&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：主循环不要改来改去，把扩展功能挂到钩子上。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五第二阶段做复杂任务&#34;&gt;五、第二阶段：做复杂任务&lt;/h2&gt;
&lt;h3 id=&#34;s05-todowrite先做计划再动手&#34;&gt;s05 TodoWrite：先做计划，再动手&lt;/h3&gt;
&lt;p&gt;如果你要写一篇大作文，你会先列提纲，对吧？Claude Code 也是这样。&lt;/p&gt;
&lt;p&gt;做复杂任务前，AI 会先写一个待办清单（Todo）：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. 读 README 了解项目      [待做]
2. 找到 bug 所在的文件     [进行中]
3. 修改代码                [待做]
4. 运行测试确认修好        [待做]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;每完成一步，就更新状态。如果 AI 太久没更新，系统还会“唠叨”它：“喂，你忘了更新待办清单啦！”&lt;/p&gt;
&lt;p&gt;这个机制让 AI 不容易“跑偏”。&lt;/p&gt;
&lt;h3 id=&#34;s06-subagent雇一个小助手&#34;&gt;s06 Subagent：雇一个小助手&lt;/h3&gt;
&lt;p&gt;有时候一个任务需要查很多东西。比如“这个项目的测试框架是什么？”AI 可能要读 10 个文件才能确定答案是 &lt;code&gt;pytest&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果让主 AI 自己读 10 个文件，它的“脑子”会塞满东西，又慢又贵。&lt;/p&gt;
&lt;p&gt;解决办法是：&lt;strong&gt;雇一个临时小助手（子代理）&lt;/strong&gt;。小助手用全新的对话去读那 10 个文件，最后只把答案“pytest”告诉主 AI。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    主AI[&amp;#34;主 AI&amp;#34;] --&amp;gt;|派任务| 子AI[&amp;#34;子 AI&amp;lt;br/&amp;gt;新开一个对话&amp;#34;]
    子AI --&amp;gt;|读10个文件| 文件[&amp;#34;项目文件&amp;#34;]
    文件 --&amp;gt;|内容| 子AI
    子AI --&amp;gt;|只返回结论：pytest| 主AI&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;主 AI 的脑子很干净，只记住了最重要的结论。&lt;/p&gt;
&lt;h3 id=&#34;s07-skill-loading需要哪本字典就翻哪本&#34;&gt;s07 Skill Loading：需要哪本字典，就翻哪本&lt;/h3&gt;
&lt;p&gt;想象你要学数学、物理、化学三科。你不会每次上课都把三本书全背上，而是上什么课带什么书。&lt;/p&gt;
&lt;p&gt;Claude Code 也是这样。它有很多“技能书”（比如 git 用法、测试规范、API 文档），但不会一次性全塞给 AI。&lt;/p&gt;
&lt;p&gt;它是两层加载：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先给目录&lt;/strong&gt;：告诉 AI 有哪些技能书；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要时再翻开&lt;/strong&gt;：AI 说“我要查 git 那本书”，系统才把完整内容给它。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样就省了很多“脑容量”。&lt;/p&gt;
&lt;h3 id=&#34;s08-context-compact脑子塞不下时怎么办&#34;&gt;s08 Context Compact：脑子塞不下时怎么办？&lt;/h3&gt;
&lt;p&gt;AI 一次能看的文字是有限的，就像你的作业本只有那么多页。如果写得太多，就要翻页或者撕掉旧的。&lt;/p&gt;
&lt;p&gt;Claude Code 有三种“翻页”方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;micro_compact&lt;/strong&gt;：把很久以前的工具结果换成一句话摘要，比如“之前用过 read_file”；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;auto_compact&lt;/strong&gt;：当文字太多时，自动让 AI 写个总结，用总结替换原来的长对话；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;compact 工具&lt;/strong&gt;：AI 自己决定什么时候该“翻页”。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 第一层[&amp;#34;第一层：micro_compact&amp;#34;]
        旧结果[&amp;#34;旧工具结果&amp;#34;] --&amp;gt; 占位符[&amp;#34;换成占位符&amp;lt;br/&amp;gt;[之前读过 main.py]&amp;#34;]
    end

    subgraph 第二层[&amp;#34;第二层：auto_compact&amp;#34;]
        太多文字[&amp;#34;对话太长&amp;#34;] --&amp;gt; 写总结[&amp;#34;AI 写摘要&amp;#34;] --&amp;gt; 替换历史[&amp;#34;用摘要替换历史&amp;#34;]
    end

    subgraph 第三层[&amp;#34;第三层：compact 工具&amp;#34;]
        AI判断[&amp;#34;AI 觉得该压缩了&amp;#34;] --&amp;gt; 手动触发[&amp;#34;调用 compact 工具&amp;#34;]
    end

    第一层 --&amp;gt; 第二层 --&amp;gt; 第三层&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;六第三阶段记得住错得了&#34;&gt;六、第三阶段：记得住、错得了&lt;/h2&gt;
&lt;h3 id=&#34;s09-memoryai-也要记笔记&#34;&gt;s09 Memory：AI 也要记笔记&lt;/h3&gt;
&lt;p&gt;AI 没有真正的记忆。每次对话结束，它就忘了。如果想让它长期记住东西（比如你喜欢什么代码风格、项目有什么规矩），就需要一个“记忆系统”。&lt;/p&gt;
&lt;p&gt;记忆系统通常分三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选择&lt;/strong&gt;：哪些东西值得记住？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提取&lt;/strong&gt;：把重要信息摘出来；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;固化&lt;/strong&gt;：存到文件或数据库里，下次对话再读出来。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    对话[&amp;#34;一段对话&amp;#34;] --&amp;gt; 选择[&amp;#34;选择重要信息&amp;#34;]
    选择 --&amp;gt; 提取[&amp;#34;提取关键事实&amp;#34;]
    提取 --&amp;gt; 存储[&amp;#34;存到记忆文件&amp;#34;]
    存储 --&amp;gt; 下次对话[&amp;#34;下次启动时读取&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;比如 AI 记住了：“这个用户喜欢用 2 个空格缩进。”下次写代码时它就会自动用 2 个空格。&lt;/p&gt;
&lt;h3 id=&#34;s10-system-prompt提示词不是写死的&#34;&gt;s10 System Prompt：提示词不是写死的&lt;/h3&gt;
&lt;p&gt;System Prompt 就是告诉 AI“你是谁、该怎么做事”的那段话。&lt;/p&gt;
&lt;p&gt;Claude Code 的 System Prompt 不是一次性写死的，而是&lt;strong&gt;运行时拼接&lt;/strong&gt;的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基础身份部分；&lt;/li&gt;
&lt;li&gt;当前项目规则；&lt;/li&gt;
&lt;li&gt;加载的技能书；&lt;/li&gt;
&lt;li&gt;用户的偏好记忆。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就像你写作文时，老师给的题目要求 + 你自己的提纲 + 参考资料，组合在一起。&lt;/p&gt;
&lt;h3 id=&#34;s11-error-recovery做错事能重来&#34;&gt;s11 Error Recovery：做错事能重来&lt;/h3&gt;
&lt;p&gt;AI 也会犯错。比如它调用了一个不存在的文件，或者写的代码运行报错。这时候怎么办？&lt;/p&gt;
&lt;p&gt;Claude Code 有几种“重来”策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;重试&lt;/strong&gt;：可能是网络抖动，再试一次就好了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;换条路&lt;/strong&gt;：这个方法不行，换另一个工具试试；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;清理空间&lt;/strong&gt;：上下文太满导致看不清，先压缩一下再试；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;换个小模型/大模型&lt;/strong&gt;：简单任务用小模型省钱，复杂任务换大模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    出错[工具执行出错] --&amp;gt; 重试{重试有用吗？}
    重试 --&amp;gt;|有用| 再试一次
    重试 --&amp;gt;|没用| 换方法[换工具/换思路]
    换方法 --&amp;gt;|还不行| 清空间[压缩上下文]
    清空间 --&amp;gt;|再试| 再试一次&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;重要道理&lt;/strong&gt;：错误不是终点，而是调整的起点。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七第四阶段长时间运行&#34;&gt;七、第四阶段：长时间运行&lt;/h2&gt;
&lt;h3 id=&#34;s12-task-system把大目标拆成小任务&#34;&gt;s12 Task System：把大目标拆成小任务&lt;/h3&gt;
&lt;p&gt;复杂项目不能靠一个简单的 Todo 清单。任务之间有依赖关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 做完了，B 才能开始；&lt;/li&gt;
&lt;li&gt;C 和 D 可以同时进行；&lt;/li&gt;
&lt;li&gt;E 要等 C 和 D 都做完。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude Code 用&lt;strong&gt;任务图&lt;/strong&gt;来管理。每个任务存成一个文件，记录自己的状态、依赖谁、被谁依赖。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;设计登录页面&amp;#34;] --&amp;gt; B[&amp;#34;写前端代码&amp;#34;]
    A --&amp;gt; C[&amp;#34;写后端接口&amp;#34;]
    B --&amp;gt; D[&amp;#34;联调测试&amp;#34;]
    C --&amp;gt; D&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;s13-background-tasks慢活放后台&#34;&gt;s13 Background Tasks：慢活放后台&lt;/h3&gt;
&lt;p&gt;有些命令要跑很久，比如 &lt;code&gt;npm install&lt;/code&gt; 可能要几分钟。如果 AI 停下来等，就太浪费了。&lt;/p&gt;
&lt;p&gt;Claude Code 会开一个新的后台线程去跑这些慢命令，主 AI 继续思考别的事。等后台跑完了，再通知 AI。&lt;/p&gt;
&lt;h3 id=&#34;s14-cron-scheduler定时任务&#34;&gt;s14 Cron Scheduler：定时任务&lt;/h3&gt;
&lt;p&gt;Cron 就是“定时器”。比如你可以让 AI 每天早上 8 点检查一遍代码仓库，看看有没有需要更新的依赖。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“到点了就干活，不用人喊。”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    时间到[时间到了] --&amp;gt; Cron[Cron 触发器]
    Cron --&amp;gt; 任务[执行预设任务]
    任务 --&amp;gt; 结果[把结果发给 AI]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;八第五阶段团队协作&#34;&gt;八、第五阶段：团队协作&lt;/h2&gt;
&lt;h3 id=&#34;s15-agent-teams多个-ai-一起干活&#34;&gt;s15 Agent Teams：多个 AI 一起干活&lt;/h3&gt;
&lt;p&gt;一个 AI 干不完的大项目，可以叫一群 AI 一起干。每个 AI 有自己的身份和“收件箱”（mailbox）。&lt;/p&gt;
&lt;p&gt;它们通过 JSONL 文件收发消息：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;leader&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alice&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;你去写登录页面&amp;#34;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alice&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;leader&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;我做好了&amp;#34;&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;每行一条消息，追加写入，像写日记一样简单。&lt;/p&gt;
&lt;h3 id=&#34;s16-team-protocols队友之间要讲规矩&#34;&gt;s16 Team Protocols：队友之间要讲规矩&lt;/h3&gt;
&lt;p&gt;多人协作不能乱说话。Claude Code 的团队协议规定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个重要请求都要带一个 &lt;code&gt;request_id&lt;/code&gt;（像快递单号）；&lt;/li&gt;
&lt;li&gt;回复时要引用同一个 &lt;code&gt;request_id&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;请求状态是 pending（等待中）、approved（同意）或 rejected（拒绝）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样就不会搞混谁同意了什么。&lt;/p&gt;
&lt;h3 id=&#34;s17-autonomous-agentsai-自己会找活干&#34;&gt;s17 Autonomous Agents：AI 自己会找活干&lt;/h3&gt;
&lt;p&gt;更高级的团队里，AI 不需要等领导分配任务。它会自己去看任务板，认领还没人做的、并且前置条件满足的任务。&lt;/p&gt;
&lt;p&gt;如果 60 秒没活干，它就自动“下班关机”。&lt;/p&gt;
&lt;h3 id=&#34;s18-worktree-isolation各干各的不打架&#34;&gt;s18 Worktree Isolation：各干各的，不打架&lt;/h3&gt;
&lt;p&gt;两个 AI 同时改同一个文件，会互相覆盖。Claude Code 用 &lt;strong&gt;git worktree&lt;/strong&gt; 给每个任务一个独立目录和独立分支：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;任务 A → 目录 auth-refactor/ → 分支 wt/auth-refactor
任务 B → 目录 ui-login/     → 分支 wt/ui-login&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;大家互不干扰，最后再把代码合并。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九第六阶段扩展组装&#34;&gt;九、第六阶段：扩展组装&lt;/h2&gt;
&lt;h3 id=&#34;s19-mcp-plugin不够用时插更多工具&#34;&gt;s19 MCP Plugin：不够用时，插更多工具&lt;/h3&gt;
&lt;p&gt;MCP 是“模型上下文协议”。你可以把它理解成“USB 接口”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code 本身带了一些工具；&lt;/li&gt;
&lt;li&gt;如果你需要连数据库、查浏览器、操作 Slack，可以通过 MCP 插进来；&lt;/li&gt;
&lt;li&gt;这些外部工具和自带工具一样，AI 都能调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    Claude[&amp;#34;Claude Code&amp;#34;] --&amp;gt; MCP[&amp;#34;MCP 接口&amp;#34;]
    MCP --&amp;gt; 数据库[&amp;#34;数据库工具&amp;#34;]
    MCP --&amp;gt; 浏览器[&amp;#34;浏览器工具&amp;#34;]
    MCP --&amp;gt; Slack[&amp;#34;Slack 工具&amp;#34;]
    数据库 --&amp;gt;|结果| Claude
    浏览器 --&amp;gt;|结果| Claude
    Slack --&amp;gt;|结果| Claude&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;s20-comprehensive-agent把所有东西拼起来&#34;&gt;s20 Comprehensive Agent：把所有东西拼起来&lt;/h3&gt;
&lt;p&gt;最后一节课，就是把前面 19 节课的所有机制都装进同一个循环里：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一个循环 + 工具 + 权限 + 钩子 + 计划 + 子代理 + 技能 + 记忆 + 压缩 + 任务图 + 后台任务 + Cron + 团队 + 自治 + Worktree + MCP = 完整的 Claude Code&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;听起来很多，但你已经一个个看过了。它们都是围绕最初那个简单循环加上的“配件”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十给新手的-5-个开发小技巧&#34;&gt;十、给新手的 5 个开发小技巧&lt;/h2&gt;
&lt;p&gt;这些技巧来自 Claude Code 的源码，平时写程序也能用到。&lt;/p&gt;
&lt;h3 id=&#34;1-用查表代替一堆-ifelse&#34;&gt;1. 用“查表”代替一堆 if/else&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 不推荐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read&amp;#34;&lt;/span&gt;: read_file()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; name &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;write&amp;#34;&lt;/span&gt;: write_file()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 推荐&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HANDLERS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;read&amp;#34;&lt;/span&gt;: read_file, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;write&amp;#34;&lt;/span&gt;: write_file}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HANDLERS[name]()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;加新功能只要加一行。&lt;/p&gt;
&lt;h3 id=&#34;2-修改列表要小心&#34;&gt;2. 修改列表要小心&lt;/h3&gt;
&lt;p&gt;如果你想在一个函数里修改外面的列表，要用切片赋值：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;messages[:] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; new_list  &lt;span style=&#34;color:#75715e&#34;&gt;# 正确：改原来的列表&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# messages = new_list   # 错误：只是让局部变量指向新列表&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;h3 id=&#34;3-用-kwargs-接受任意参数&#34;&gt;3. 用 &lt;code&gt;**kwargs&lt;/code&gt; 接受任意参数&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;handler&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;kw):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(kw[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;handler(path&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main.py&amp;#34;&lt;/span&gt;, limit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;&lt;code&gt;(**kw)&lt;/code&gt; 表示“不管什么参数名，都装进字典 kw 里”。&lt;/p&gt;
&lt;h3 id=&#34;4-守护线程做后台任务&#34;&gt;4. 守护线程做后台任务&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; threading
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; threading&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Thread(target&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;download_file, daemon&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;start()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;主程序退出时，守护线程会自动结束，不会卡住。&lt;/p&gt;
&lt;h3 id=&#34;5-jsonl-比-json-更适合追加写入&#34;&gt;5. JSONL 比 JSON 更适合追加写入&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 写：每行一条&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;with&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inbox.jsonl&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write(json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;dumps(msg) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 读：逐行解析&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; open(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;inbox.jsonl&amp;#34;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    msg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loads(line)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;追加写入很安全，不会因为同时写入而损坏文件。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;十一总结&#34;&gt;十一、总结&lt;/h2&gt;
&lt;p&gt;Claude Code 看起来很厉害，但它的核心其实非常朴素：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一个 while 循环 + 一张工具表 + 一个会说话的 AI。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;真正让它变强的，是围绕这个循环一层层加上的“配件”：权限、计划、子代理、技能、记忆、压缩、任务图、后台任务、团队、自治、目录隔离、MCP……&lt;/p&gt;
&lt;p&gt;这些配件都是为了解决一个核心问题：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;怎么让一个只会说话的 AI，真正能在现实世界里连续、安全、高效地干活。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;理解了这个骨架之后，你再回头看 Claude Code，就不会觉得它是黑魔法了。它就是一个被精心设计的“机器人工作台”，而我们看到的聪明，来自那个会思考的大脑，加上一套会执行的 harness。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大脑负责想，工作台负责做。把工作台造好，大脑就能发挥全部实力。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文是学习 &lt;a href=&#34;https://github.com/shareAI-lab/learn-claude-code&#34;&gt;shareAI-lab/learn-claude-code&lt;/a&gt; 的笔记整理。如果你想动手，可以从 &lt;code&gt;s01_agent_loop/code.py&lt;/code&gt; 开始，一课一课跟着做。&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
