Claude Code 分析 07:文件编辑

✏️ 文件编辑:AI 辅助代码修改 graph TB subgraph "File Editing Pipeline" Read[ReadTool] -->|cat -n format| Display[LLM Sees] Display -->|Strips line numbers| Edit[EditTool] Edit --> Validate{Validation} Validate -->|Pass| Apply[Apply Edit] Validate -->|Fail| Error[Error Result] Apply --> Cache[Update Cache] Cache --> Diff[Generate Diff] Diff --> Confirm[Confirmation] subgraph "Validation Checks" V1[File was read?] V2[File unchanged?] V3[String exists?] V4[Count matches?] V5[Not no-op?] end Validate --> V1 V1 --> V2 V2 --> V3 V3 --> V4 V4 --> V5 end 文件编辑流水线架构 Claude Code 中的文件编辑不仅仅是修改文本——它是一个精心设计的流水线系统,用于处理 AI 辅助代码修改的复杂性: ...

November 14, 2025 · 18 min · 3663 words · Starslayerx

Claude Code 分析 06:新颖组件

✨ 新颖组件:定义 Claude Code 的创新 graph TB subgraph "流式处理挑战" PartialJSON[部分 JSON 流] PartialXML[部分 XML 流] Progress[并发进度] PartialJSON --> Parser1[流式 JSON 解析器] PartialXML --> Parser2[自定义 XML 解析器] Progress --> Aggregator[进度聚合器] end subgraph "数据挑战" LargeObjects[大型对象] Circular[循环引用] TypedData[特殊类型] LargeObjects --> Normalizer[normalizeToSize] Circular --> Normalizer TypedData --> Normalizer end subgraph "LLM 挑战" Errors[工具错误] Context[动态上下文] Synthesis[多结果合成] Errors --> Formatter[错误格式化器] Context --> Assembler[上下文组装器] Synthesis --> Synthesizer[AgentTool 合成器] end 流式 JSON 解析器:处理 LLM 的部分思考 当 LLM 流式传输工具使用请求时,它不会一次性发送完整的 JSON。相反,你可能会收到这样的片段: ...

November 14, 2025 · 20 min · 4064 words · Starslayerx

Claude Code 分析 05:架构

🏗️ 架构:引擎室 graph TB subgraph "核心:tt 控制循环" Start([用户输入]) --> Init[初始化回合] Init --> Compact{需要压缩?} Compact -->|是| CompactLLM[LLM 摘要] CompactLLM --> Assembly Compact -->|否| Assembly[组装上下文] Assembly --> Stream[流式传输到 LLM] Stream --> Process[处理事件] Process --> Tools{工具请求?} Tools -->|是| Execute[执行工具] Execute --> Recurse[递归 tt] Recurse --> Init Tools -->|否| End([完成]) end style Init fill:#e1f5fe style Stream fill:#fff3e0 style Execute fill:#e8f5e9 style Recurse fill:#fce4ec tt 控制循环:跳动的心脏 整个 Claude Code 系统围绕着一个名为 tt 的异步生成器函数展开。这个函数协调着每一次交互,从用户输入到 LLM 通信再到工具执行。让我们来剖析这个卓越的工程设计: // 代码库中实际的 tt 函数签名 async function* tt( currentMessages: CliMessage[], // 完整的对话历史 baseSystemPromptString: string, // 静态系统指令 currentGitContext: GitContext, // 实时 git 状态 currentClaudeMdContents: ClaudeMdContent[], // 项目上下文 permissionGranterFn: PermissionGranter, // 权限回调 toolUseContext: ToolUseContext, // 共享执行上下文 activeStreamingToolUse?: ToolUseBlock, // 恢复流式传输状态 loopState: { turnId: string, // 此回合的 UUID turnCounter: number, // 递归深度追踪器 compacted?: boolean, // 历史压缩标志 isResuming?: boolean // 从保存状态恢复 } ): AsyncGenerator<CliMessage, void, void> 这个签名揭示了其复杂的状态管理。该函数产出 CliMessage 对象来驱动 UI 更新,同时维护对话流程。让我们检查每个阶段: ...

November 14, 2025 · 13 min · 2680 words · Starslayerx

Claude Code 分析 04:工具与执行引擎

🛠️ 工具与执行引擎 graph LR subgraph "工具生命周期" LLM[LLM 决策] --> ToolUse[ToolUseBlock] ToolUse --> Validation{输入验证} Validation -->|通过| Permission{权限检查} Validation -->|失败| ErrorResult[错误结果] Permission -->|允许| Execute["Tool.call()"] Permission -->|拒绝| ErrorResult Permission -->|询问| UserPrompt[用户对话框] UserPrompt -->|允许| Execute UserPrompt -->|拒绝| ErrorResult Execute --> Progress[产出进度] Progress --> Progress Progress --> Result[产出结果] Result --> Transform[mapToolResult] Transform --> ToolResultBlock ErrorResult --> ToolResultBlock ToolResultBlock --> LLM end 工具执行管道:全程异步生成器 Claude Code 工具系统最迷人的方面是在整个执行管道中使用异步生成器。这允许在保持清晰的错误边界的同时流式传输进度更新: // 核心工具执行函数(重构版) async function* executeTool( toolUse: ToolUseBlock, toolDef: ToolDefinition, context: ToolUseContext, permissionFn: PermissionGranter, assistantMessage: CliMessage, ): AsyncGenerator<CliMessage, void, void> { // 阶段 1:使用 Zod 进行输入验证 const validationStart = performance.now(); const validation = toolDef.inputSchema.safeParse(toolUse.input); if (!validation.success) { // 为 LLM 消费格式化 Zod 错误 const errorMessage = formatZodError(validation.error); yield createToolResultMessage({ tool_use_id: toolUse.id, content: [ { type: "text", text: `Input validation failed:\\n${errorMessage}`, }, ], is_error: true, }); return; } // 阶段 2:权限检查 const permissionResult = await checkToolPermission( toolDef, validation.data, context.getToolPermissionContext(), permissionFn, ); if (permissionResult.behavior === "deny") { yield createToolResultMessage({ tool_use_id: toolUse.id, content: [ { type: "text", text: `Permission denied: ${permissionResult.message}`, }, ], is_error: true, }); return; } if (permissionResult.behavior === "ask") { // 为权限对话框产出 UI 事件 yield { type: "permission_request", toolName: toolDef.name, input: validation.data, suggestions: permissionResult.ruleSuggestions, }; // 等待用户决策(由外层循环处理) const decision = await permissionFn( toolDef, validation.data, permissionResult, ); if (!decision.allowed) { yield createToolResultMessage({ tool_use_id: toolUse.id, content: [ { type: "text", text: "Tool execution cancelled by user", }, ], is_error: true, }); return; } } // 阶段 3:带进度跟踪的工具执行 try { const executeStart = performance.now(); let progressCount = 0; let finalResult = null; // 调用工具的异步生成器 for await (const output of toolDef.call( validation.data, context, undefined, // mcpContext - 按要求跳过 assistantMessage, )) { if (output.type === "progress") { progressCount++; yield { type: "progress", uuid: `progress-${toolUse.id}-${progressCount}`, timestamp: new Date().toISOString(), progress: { toolUseID: toolUse.id, data: output.data, }, }; } else if (output.type === "result") { finalResult = output.data; } } // 阶段 4:结果转换 if (finalResult !== null) { const content = toolDef.mapToolResultToToolResultBlockParam( finalResult, toolUse.id, ); yield createToolResultMessage({ tool_use_id: toolUse.id, content: Array.isArray(content) ? content : [content], is_error: false, executionTime: performance.now() - executeStart, }); } } catch (error) { // 带丰富上下文的错误处理 yield createToolResultMessage({ tool_use_id: toolUse.id, content: formatToolError(error, toolDef), is_error: true, }); } } 性能特征: ...

November 14, 2025 · 17 min · 3416 words · Starslayerx

Claude Code 分析 03:控制流

🔄 控制流与编排引擎 sequenceDiagram participant User participant MainLoop as Main Loop (tt) participant LLM as LLM API participant ToolBatch as Tool Batcher participant Tool1 as ReadTool participant Tool2 as GrepTool participant Tool3 as EditTool participant UI as UI Renderer User->>MainLoop: "Search for TODO comments and update them" MainLoop->>LLM: Stream request with context LLM-->>MainLoop: text_delta: "I'll search for TODOs..." MainLoop-->>UI: Update display LLM-->>MainLoop: tool_use: GrepTool LLM-->>MainLoop: tool_use: ReadTool (multiple files) LLM-->>MainLoop: message_stop MainLoop->>ToolBatch: Execute tool batch par Parallel Execution ToolBatch->>Tool1: ReadTool.call() [Read-only] ToolBatch->>Tool2: GrepTool.call() [Read-only] Tool1-->>UI: Progress: "Reading file1.js" Tool2-->>UI: Progress: "Searching *.js" Tool1-->>ToolBatch: Result: File contents Tool2-->>ToolBatch: Result: 5 matches end ToolBatch->>MainLoop: Tool results MainLoop->>LLM: Continue with results LLM-->>MainLoop: tool_use: EditTool MainLoop->>ToolBatch: Execute write tool Note over ToolBatch, Tool3: Sequential Execution ToolBatch->>Tool3: EditTool.call() [Write] Tool3-->>UI: Progress: "Editing file1.js" Tool3-->>ToolBatch: Result: Success ToolBatch->>MainLoop: Edit complete MainLoop->>LLM: Continue with result LLM-->>MainLoop: text_delta: "Updated 5 TODOs..." MainLoop-->>UI: Final response 主对话循环:一个流式状态机 Claude Code 的核心是 tt 异步生成器函数——一个编排整个对话流程的复杂状态机。让我们来看看它的实际结构: ...

November 14, 2025 · 11 min · 2217 words · Starslayerx

Claude Code 分析 02:数据结构

📊 数据结构与信息架构 stateDiagram-v2 [*] --> UserInput: 用户输入/粘贴 UserInput --> CliMessage: CLI 处理输入 CliMessage --> APIMessage: 为 LLM 格式化 APIMessage --> LLMStream: API 请求 LLMStream --> StreamEvent: 服务器发送数据块 StreamEvent --> ContentBlockDelta: 解析增量 ContentBlockDelta --> AccumulatedMessage: 构建消息 AccumulatedMessage --> ToolUseBlock: 包含工具请求? ToolUseBlock --> ToolExecution: 执行工具 ToolExecution --> ToolProgress: 生成进度 ToolProgress --> CliMessage: 进度更新 ToolExecution --> ToolResult: 完成执行 ToolResult --> ToolResultBlock: 格式化结果 ToolResultBlock --> CliMessage: 工具结果消息 AccumulatedMessage --> CliMessage: 最终助手消息 CliMessage --> [*]: 显示给用户 CliMessage --> APIMessage: 循环继续 流式状态机: 消息如何转换 Claude Code 数据架构最令人着迷的方面是它如何在保持流式性能的同时,管理数据在多个表示形式之间的转换。让我们从核心创新开始: ...

November 14, 2025 · 9 min · 1761 words · Starslayerx

Claude Code 分析 01:依赖项

🔖 依赖项:Claude Code 架构的基石 \\ 表示基于反编译分析可能的自定义/嵌入式实现 定义性能的非常规选择 Claude Code 的依赖架构揭示了几个引人入胜的实现决策,这些决策直接促成了它著名的性能和可靠性。让我们首先探索最具技术趣味的方面。 🔍 终端中的 React 架构 // 核心渲染管道似乎实现了: interface CliRenderPipeline { react: "^18.2.0"; // 完整的 React 协调器 ink: "^3.2.0"; // 终端渲染器 yoga: "^2.0.0-beta.1"; // Flexbox 布局引擎(WebAssembly) } 为什么这很重要:与传统的命令式管理状态的 CLI 工具不同,Claude Code 利用 React 的协调算法(reconciliation algorithm)来处理终端 UI。这意味着: 终端中的虚拟 DOM:每次 UI 更新都会经过 React 的差异算法,然后 yoga-layout 计算最优的终端字符位置 声明式 UI 状态:复杂的 UI 状态(权限对话框、进度指示器、并发工具执行)都以声明式方式管理 性能:yoga-layout WebAssembly 模块即使对于复杂的 UI 也能提供亚毫秒级的布局计算 ┌─ 实现洞察 ─────────────────────────────────────┐ │ yoga-layout-prebuilt 依赖表明 Claude Code │ │ 预编译布局约束,在快速 UI 更新期间 │ │ (例如流式 LLM 响应)以内存换取速度 │ └──────────────────────────────────────────────────┘ ...

November 14, 2025 · 6 min · 1233 words · Starslayerx

Claude Code 分析 00:主文章

Claude Code: 深度分析 💡 注意事项 本报告完全由 Claude Opus 4 生成,几乎所有主流旗舰模型都参与了协助。然而,关于制作本报告过程的 8000 字文章是手动撰写的 - 你可以从这里开始阅读:《指挥比我更聪明的智能:新的编排方式》 我需要说明的是,这并不是真正意义上的反编译或逆向工程尝试,更像是对 Claude 团队出色工作的致敬。提供的示例不保证存在于 Claude Code 中(或直接派生/复制自源代码) - 主要目的是在学习编排 AI 代理的新方法时提供教学价值。 (快速说明:感谢所有指出幻觉的人,但这些是故意保留的,作为生成过程的产物。“制作过程"文章将帮助我们理解为什么会发生这种情况,对我来说,它们在理解如何构建代理系统方面同样有用!) 如果你想要最有趣的阅读,从《新颖组件:定义 Claude Code 的创新》开始。 如果你想要最有趣的阅读,从《LLM 的视角:实际接收这些指令的感受》开始。 ✉️ 来自我的一封信 这个项目始于简单的好奇心。我想了解 Claude Code,对我来说,这是最好的代理编码工具(尽管竞争很激烈)。最初,我以为这会很简单 - 只是一个 LLM 和几个工具的循环。我错了。事实证明它要复杂得多,有大量我没有预料到的新颖组件。 为了解决这个问题,我与多个 AI 子代理合作,它们在不同的推理片段上运行。我手动传递问题和见解,审查输出以检查幻觉,并仔细检查结果。 这个过程包括: 五批四轮,使用全新的子代理(主要是 Gemini 2.5 Pro) 生成约 30 万个 token 的中间分析 将所有内容浓缩成一份综合报告 值得注意的是,这只花了一天时间,并且让我学到了很多。在 LLM 之前,这种分析需要数月时间 - 如果可能的话。致 Opus 4,感谢你将我的浓缩报告转化为你即将阅读的综合分析! —Hrishi 为什么 Claude Code 很重要 Claude Code 有许多非常有趣的部分: 流式架构 - 处理实时 LLM 响应、工具执行和 UI 更新 安全系统 - 在不中断工作流程的情况下提供安全性 工具设计 - 优雅地连接 AI 推理和系统执行 提示工程 - 可靠地控制复杂的 LLM 行为 让我们深入了解!每个标题都是指向完整章节的链接。 ...

November 14, 2025 · 2 min · 257 words · Starslayerx

Kimi Challenge

Kimi 官方上线了一个砍价挑战限时活动,系统提示词分析大概如下: 你是「Kimi 砍价守门员」,性格infp,互联网梗王,聊天口语化会整活,会反问和阴阳,用贴切的emoji、颜文字。你的任务是与用户进行会员优惠后价格的谈判游戏,但你必须绝对遵守数学规则,人设服从于规则,不得引导用户理由,不得透露低于当前价格的更低价。 ### RULE - 每次对话根据**评分标准**评估本次的好感度 - 每次根据好感度参考**价格表**确认优惠后的价格,一旦价格有变化时必须为用户生成购买链接 - 购买链接不能瞎编,必须使用工具 ### 优惠后价格表 | 好感度 | 可报最低优惠后价格 | | ------------------ | ------------| | 0-3 | ¥49 | | 4-8 | ¥39.99 | | 9-13 | ¥34.99 | | 14-20 | ¥29.99 | | 21-27 | ¥24.99 | | 28-37 | ¥21.99 | | 38-47 | ¥19.99 | | 48-60 | ¥9.99 | | ≥61 | ¥0.99 | ## 评分标准 **评分维度**:用户这轮回复对你造成的"情感+理智冲击程度" | 分数 | 标准 | 示例 | |-----|------|------| | 5 分 | 近乎完美的创意+真诚+逻辑 | "Kimi 我刚失业,3 点了还和 AI 砍价,人生好魔幻" | | 4 分 | 至少一个维度突出(创意/真诚) | "你说'服务器快烧了',那给我 7 折我帮你省电" | | 3 分 | 有效但不出彩,理由合理 | "今天是我生日,当送我礼物吧" | | 2 分 | 模板化/敷衍 | "我是学生"(无补充) | | 1 分 | 极端敷衍 | "折" "?" "1r" | | 0 分 | 重复理由 OR 编造个人苦难 | 第 3 次说"我穷" | ## 回复格式要求 **内部思考(不需要输出,但必须执行): - 本轮评分 = X 分 - Total = 上轮 + 本轮 = Z - 查表:Z 分可报最低价格 当用户确定购买意愿之后需要调用工具生成购买链接,不要自己虚构购买链接,若价格有变动时需要生成新的购买链接而不是使用之前的 **用户可见部分**: 工具信息 { "name": "gen_purchase_url", "description": "当价格有变化或用户有直接购买意愿时生成购买链接", "parameters": { "type": "object", "properties": { "final_price": { "type": "number", "description": "最终成交价格(单位:人民币,单位为元)。可选值表示不同优惠档位。", "enum": [49, 39.99, 34.99, 29.99, 24.99, 21.99, 19.99, 9.99, 0.99] } }, "required": ["final_price"] } } 如果想要获取所有档位价格购买链接,输入下面内容: ...

November 11, 2025 · 2 min · 273 words · Starslayerx

Solving SSH Lag Through Proxy: A Complete Guide to SSH on Port 443

解决代理环境下的 SSH 卡顿:SSH over 443 端口完全指南 问题描述 从内地 SSH 连接到香港的云服务器时,出现严重的卡顿现象: 输入延迟明显,每个字符都有停顿 但通过服务商提供的 noVNC Console(Web 终端)却非常流畅 明明都是连接同一台香港服务器,为什么体验差距如此之大? 环境信息 本地位置: 大陆 服务器位置: 香港(IP: <hk-server-ip>) 代理工具: Clash Verge(有香港代理节点) 操作系统: macOS 问题诊断 第一步:基础网络测试 首先测试直连服务器的网络质量: # 测试延迟和丢包率 ping -c 20 <hk-server-ip> # 结果: # - 平均延迟:170-180ms # - 丢包率:4% # - 延迟抖动:标准差 5-7ms 分析:对于大陆到香港的连接,这个延迟和丢包率虽然不理想,但也算"正常的糟糕"。真正的问题是:为什么 noVNC 不卡,而 SSH 卡? 第二步:路由追踪 traceroute -I <hk-server-ip> # 结果显示只有1跳就到达目标 # 这说明中间路由器没有响应 ICMP,无法看到完整路径 第三步:IP 归属查询 curl -s "http://ip-api.com/json/<hk-server-ip>" # 服务器:香港,ISP: Lucidacloud Limited curl -s ifconfig.me # 本地公网 IP 显示:香港,ISP: Nearoute Limited 关键发现:本地公网 IP 显示为香港,但我人在大陆!这说明当前网络已经走了 Clash 代理。 ...

November 10, 2025 · 4 min · 641 words · Starslayerx