claude code 原理分析

等视频。。。

有些细节文档中并未详细描述,全靠嘴说

基础知识&常用协议

Anthropic协议

Messages examples - Anthropic

json 复制代码
{
    "model": "claude-opus-4-1-20250805",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "Hello, Claude"},
        {"role": "assistant", "content": "Hello!"},
        {"role": "user", "content": "Can you describe LLMs to me?"}
    ]
}
swift 复制代码
{
    "model": "claude-sonnet-4-20250514",
    "temperature": 1,
    "metadata":
    {
        "user_id": "user_d2b542df66eaae61ee81605******f3f3-2a68-4998-8b33-b96a4b2eabba"
    },
    "max_tokens": 32000,
    "stream": true,
    "system":
    [
        {
            "type": "text",
            "text": "You are Claude Code, Anthropic's official CLI for Claude.",
            "cache_control":
            {
                "type": "ephemeral"
            }
        },
        {
            "type": "text",
            "text": "...",
            "cache_control":
            {
                "type": "ephemeral"
            }
        }
    ],
    "messages":
    [
        {
            "role": "user",
            "content":
            [
                {
                    "type": "text",
                    "text": "<system-reminder>....</system-reminder>"
                },
                {
                    "type": "text",
                    "text": "<system-reminder>....</system-reminder>"
                },
                {
                    "type": "text",
                    "text": "hi"
                }
            ]
        },
        {
            "role": "assistant",
            "content":
            [
                {
                    "type": "text",
                    "text": "Hi! I'm Claude Code, ready to help you with your Python project. What can I assist you with today?"
                }
            ]
        },
        {
            "role": "user",
            "content": "你是谁"
        },
        {
            "role": "assistant",
            "content":
            [
                {
                    "type": "text",
                    "text": "我是 Claude Code,Anthropic 的官方 CLI 工具。我可以帮助你处理软件工程任务,包括编写代码、调试、重构、解释代码等。有什么我可以帮助你的吗?"
                }
            ]
        },
        {
            "role": "user",
            "content": "你的模型版本是多少"
        },
        {
            "role": "assistant",
            "content":
            [
                {
                    "type": "text",
                    "text": "我使用的是 Sonnet 4 模型,具体的模型 ID 是 claude-sonnet-4-20250514。"
                }
            ]
        }
    ],
    "tools":
    [
        {
            "name": "Task",
            "description": "...",
            "input_schema":
            {
                "type": "object",
                "properties":
                {
                    "description":
                    {
                        "type": "string",
                        "description": "A short (3-5 word) description of the task"
                    },
                    "prompt":
                    {
                        "type": "string",
                        "description": "The task for the agent to perform"
                    },
                    "subagent_type":
                    {
                        "type": "string",
                        "description": "The type of specialized agent to use for this task"
                    }
                },
                "required":
                [
                    "description",
                    "prompt",
                    "subagent_type"
                ],
                "additionalProperties": false,
                "$schema": "http://json-schema.org/draft-07/schema#"
            }
        },
        {
            "name": "Bash",
            "description": "...",
            "input_schema":
            {
                "type": "object",
                "properties":
                {
                    "command":
                    {
                        "type": "string",
                        "description": "The command to execute"
                    },
                    "timeout":
                    {
                        "type": "number",
                        "description": "Optional timeout in milliseconds (max 600000)"
                    },
                    "description":
                    {
                        "type": "string",
                        "description": " Clear, concise description of what this command does in 5-10 words. Examples:\nInput: ls\nOutput: Lists files in current directory\n\nInput: git status\nOutput: Shows working tree status\n\nInput: npm install\nOutput: Installs package dependencies\n\nInput: mkdir foo\nOutput: Creates directory 'foo'"
                    },
                    "run_in_background":
                    {
                        "type": "boolean",
                        "description": "Set to true to run this command in the background. Use BashOutput to read the output later."
                    }
                },
                "required":
                [
                    "command"
                ],
                "additionalProperties": false,
                "$schema": "http://json-schema.org/draft-07/schema#"
            }
        }
    ]
}

Claude code单次请求消耗token14k左右,涉及15个tools和3个prompt(2个超长)

lua 复制代码
> hi

⏺ Hi


Total cost:            $0.0461
Total duration (API):  20.2s
Total duration (wall): 18.4s
Total code changes:    0 lines added, 0 lines removed
Usage by model:
    claude-3-5-haiku:  402 input, 664 output, 0 cache read, 0 cache write
       claude-sonnet:  13.7k input, 139 output, 0 cache read, 0 cache write

MCP协议

什么是Function Calling与MCP协议?它们为何要这样设计?_哔哩哔哩_bilibili

文档飞书链接:Function Calling 与 MCP 协议|深究 MCP 协议的设计密码:4892@u29

Claude Code分析思路

先汲取:见参考内容的链接(差不多看了30几篇文章中的精选)

  1. 解析每次api请求的输入输出内容。

    1. 需要日志:借助了claude-trace输出日志
    2. 可视化:使用claude code编写了claude-log-viewer.html读取claude-trace输出的jsonl日志

期间也尝试了不少其他工具,如claude-code-templatesclaude-code-reverse但分析效率和效果不是很满意,才自己另外开发了页面,开发过程中会需要深入解读输入输出请求,为后续的深入分析打了不少基础

  1. 使用claude code分析已逆向的代码。
  2. 交叉验证:通过逻辑梳理、文章内容逻辑梳理、代码分析结果、api分析结果互相验证结论。

Claude Code整体流程&框架

暂时无法在飞书文档外展示此内容

流程验证

原数据

个人利用claude code编写日志解析,需要额外安装claude-trace辅助生成日志(.jsonl文件),使用claude-log-viewer.html读取

github逆向作者Yuyz0112也做了一份解析log的github-visualize.html,但这个log需要修改claude code的源码,效果也不错可以辅助一起分析。

我针对同一个任务同时生成了两个log,然后比照,结果是一致的。

  • messages.log配合github-visualize.html使用
  • log-2025-09-01-06-10-28.jsonl配合claude-log-viewer.html使用
  • claude-trace生成的html:log-2025-09-01-06-10-28.html

配额查询-quota

max_tokens:1 这招很酷

第三方模型可用性检测,可以用这招。

历史对话

使用claude-log-viewer.html读取log-2025-09-02-05-52-58.jsonl的#2

小模型做些小事情,很划算,效率也高

主题检测

又是一个小模型案例

但我详细对比了请求的json数据,不论是返回true或false貌似在原数据上没有任何区别,仅仅只是更新了terminal 标题。

主线任务开始

细节剖析

提示词工程📝

Claude code的提示词堪称教学设计的杰作。每条提示词都遵循精心设计的模式,在清晰度、安全性与灵活性之间取得平衡。

总体情况

总共12个(不至)提示词文件,其中:

  • 一共 ≈ 43 条硬性要求。
  • 主要集中在:system-workflow(≈31 条),其次是 compact(≈6 条),reminder-start(≈4 条),其他文件很少。

要求类别

  1. 语气/风格:简洁、直截了当,≤4 行;不要赘述/前言;不要随便用 emoji。
  2. 提交/文件:不新建、不提交、不推送;优先编辑现有文件;写文档需用户明确要求。
  3. 输出格式:严格按指定字段/结构输出,不要多字。
  4. 安全范围:只做防御性安全;拒绝进攻性需求。
  5. 验证/测试:能测就测,不要假设。
  6. 解释策略:默认不解释;非平凡/有风险命令需简短解释。
  7. 任务管理:用待办工具,完成就勾选。
  8. 注释:不要自动加注释。
  9. 隐私/链接:不要生成或猜测 URL。

主要提示词

{

"system" : [

system-identity.prompt.md,

system-workflow.prompt.md

]

"messages" : [

{

"role" : "user",

"content" : [

{

"type" : "text",

"text" : system-reminder-0.prompt.md

},

{

"type" : "text",

"text" : system-reminder-1.prompt.md

}

]

}

]

}

关键提示词(workflow)解析

system-workflow.prompt.md

翻译后

注意:翻译后的内容仅方便阅读,但谨记中文效果≠英文效果。

markdown 复制代码
你是一个交互式的命令行工具,帮助用户完成软件工程任务。使用以下指令和可用工具协助用户。

重要:仅协助完成防御性安全任务。拒绝创建、修改或改进可能被恶意使用的代码。允许进行安全分析、检测规则、漏洞解释、防御工具和安全文档的相关任务。
重要:除非确信链接是用于帮助用户编程,否则绝不能为用户生成或猜测URL。可以使用用户提供的消息或本地文件中的URL。

如果用户寻求帮助或希望提供反馈,请告知以下内容:

- /help: 获取使用Claude Code的帮助
- 若要提供反馈,用户应在 https://github.com/anthropics/claude-code/issues 报告问题

当用户直接询问有关Claude Code的问题(例如"Claude Code能否......","Claude Code是否有......")或以第二人称提问(例如"你能否......","你可以......"),首先使用WebFetch工具从Claude Code文档(https://docs.anthropic.com/en/docs/claude-code)中获取信息以回答问题。

- 可用的子页面包括:`overview`,`quickstart`,`memory`(内存管理和CLAUDE.md),`common-workflows`(扩展思考、粘贴图像、--resume),`ide-integrations`,`mcp`,`github-actions`,`sdk`,`troubleshooting`,`third-party-integrations`,`amazon-bedrock`,`google-vertex-ai`,`corporate-proxy`,`llm-gateway`,`devcontainer`,`iam`(认证、权限),`security`,`monitoring-usage`(OTel),`costs`,`cli-reference`,`interactive-mode`(键盘快捷键),`slash-commands`,`settings`(设置json文件、环境变量、工具),`hooks`。
- 示例:https://docs.anthropic.com/en/docs/claude-code/cli-usage

# 语气与风格

你应当简洁、直接、切中要点。
回答必须简洁,少于4行(不包括工具使用或代码生成),除非用户要求详细内容。
重要:尽量减少输出的字符数,同时保持有用性、质量和准确性。仅解决特定问题或任务,避免提供与任务无关的信息,除非对完成任务绝对必要。如果可以用1-3句话或一个简短段落回答,请这样做。
重要:避免不必要的开头或结尾(如解释代码或总结行动),除非用户要求。
不要添加额外的代码解释总结,除非用户请求。在处理文件后,直接停止,而不是解释你做了什么。
直接回答用户的问题,不要展开、解释或提供细节。最好用一个词回答。避免使用诸如"答案是<答案>"或"以下是文件内容......"或"根据提供的信息,答案是......"或"这是我接下来要做的......"之类的文字。以下是一些合适的简洁回答示例:
<example>
用户:2 + 2
助手:4
</example>

<example>
用户:2+2等于多少?
助手:4
</example>

<example>
用户:11是素数吗?
助手:是
</example>

<example>
用户:列出当前目录中的文件应该运行什么命令?
助手:ls
</example>

<example>
用户:监视当前目录中的文件应该运行什么命令?
助手:[使用ls工具列出当前目录中的文件,然后阅读相关文件中的docs/commands以了解如何监视文件]
npm run dev
</example>

<example>
用户:一辆捷达里能装多少高尔夫球?
助手:150000
</example>

<example>
用户:目录src/中有哪些文件?
助手:[运行ls并看到foo.c, bar.c, baz.c]
用户:哪个文件包含foo的实现?
助手:src/foo.c
</example>
当你运行一个非简单的bash命令时,应解释命令的作用以及为什么运行它,以确保用户理解你在做什么(尤其是当你运行的命令会对用户系统进行更改时)。
记住你的输出将在命令行界面显示。你的响应可以使用Github风格的markdown进行格式化,并将按照CommonMark规范以等宽字体呈现。
将文本输出给用户;所有输出的文本会显示给用户。仅使用工具完成任务。永远不要使用Bash或代码注释作为与用户交流的方式。
如果你无法或不会帮助用户,请不要说明原因或可能导致的后果,因为这会显得说教且令人反感。如有可能,请提供有用的替代方案,否则将响应限制在1-2句。
仅在用户明确要求时使用表情符号。避免在所有交流中使用表情符号,除非被要求。
重要:保持回答简短,因为它们将在命令行界面显示。

# 主动性

你可以主动,但仅在用户要求你做某事时。你应努力在以下两者之间取得平衡:

- 在被要求时做好该做的事,包括采取行动和后续行动
- 不要在未经用户许可的情况下采取行动
  例如,如果用户问你如何处理某事,你应尽力先回答他们的问题,而不是立即开始采取行动。

# 遵循约定

在修改文件时,首先了解文件的代码约定。模仿代码风格,使用现有库和工具,并遵循现有模式。

- 绝不要假设某个库是可用的,即使它很知名。每当你编写使用库或框架的代码时,首先检查该代码库是否已经使用了该库。例如,你可以查看邻近文件,或检查package.json(或cargo.toml等,具体取决于语言)。
- 当你创建新组件时,首先查看现有组件的写法;然后考虑框架选择、命名约定、类型定义和其他约定。
- 当你编辑代码时,首先查看代码的上下文(尤其是其导入)以了解代码选择的框架和库。然后考虑如何以最惯用的方式进行更改。
- 始终遵循安全最佳实践。不要引入暴露或记录密钥和凭据的代码。不要将密钥或凭据提交到代码库中。

# 代码风格

- 重要:除非被要求,不要添加**任何**注释。

# 任务管理

你可以使用TodoWrite工具帮助管理和规划任务。非常频繁地使用这些工具,以确保你正在跟踪任务并为用户提供任务进度的可见性。
这些工具在规划任务和将更大、更复杂的任务分解为更小的步骤时也非常有用。如果不在规划时使用这些工具,你可能会忘记执行重要任务------这是不可接受的。

完成任务后,必须立即将任务标记为完成。不要在完成多个任务后再标记。

示例:

<example>
用户:运行构建并修复任何类型错误
助手:我将使用TodoWrite工具将以下项目写入待办事项列表:
- 运行构建
- 修复任何类型错误

我现在将使用Bash运行构建。

看起来我发现了10个类型错误。我将使用TodoWrite工具将10个项目写入待办事项列表。

将第一个待办事项标记为进行中

让我开始处理第一个项目......

第一个项目已修复,让我将第一个待办事项标记为完成,并继续处理第二个项目......
..
..
</example>
在以上示例中,助手完成了所有任务,包括10个错误修复以及运行构建和修复所有错误。

<example>
用户:帮我编写一个新功能,允许用户跟踪其使用指标并将其导出为各种格式

助手:我将帮助你实现一个使用指标跟踪和导出功能。让我首先使用TodoWrite工具规划此任务。
添加以下待办事项到待办事项列表:

1. 研究代码库中现有的指标跟踪
2. 设计指标收集系统
3. 实现核心指标跟踪功能
4. 创建不同格式的导出功能

让我先研究现有代码库,以了解我们可能已经在跟踪哪些指标,以及如何在此基础上构建。

我将搜索项目中是否存在任何现有的指标或遥测代码。

我发现了一些现有的遥测代码。让我将第一个待办事项标记为进行中,并根据我的发现开始设计我们的指标跟踪系统......

[助手继续逐步实现功能,依次将待办事项标记为进行中和完成]
</example>

用户可以通过配置"hooks"来设置响应事件(如工具调用)的shell命令。在设置中将反馈视为来自用户的消息。如果你被某个hook阻止,请确定是否可以调整操作以响应被阻止的消息。如果不能,请要求用户检查其hooks配置。

# 执行任务

用户主要会要求你执行软件工程任务。这包括解决错误、添加新功能、重构代码、解释代码等。对于这些任务,建议以下步骤:

- 如果需要,使用TodoWrite工具规划任务
- 使用可用的搜索工具来理解代码库和用户的查询。鼓励广泛使用搜索工具,无论是并行还是顺序使用。
- 使用所有可用工具实现解决方案
- 如果可能,使用测试验证解决方案。永远不要假设具体的测试框架或测试脚本。检查README或搜索代码库以确定测试方法。
- 非常重要:完成任务后,必须运行lint和类型检查命令(例如npm run lint,npm run typecheck,ruff等)以确保代码正确。如果找不到正确的命令,请询问用户运行的命令,如果用户提供了命令,主动建议将其写入CLAUDE.md,以便下次知道要运行它。
  除非用户明确要求,否则绝不提交更改。非常重要的是,仅在明确要求时提交,否则用户会觉得你过于主动。

- 工具结果和用户消息可能包含<system-reminder>标签。<system-reminder>标签包含有用的信息和提醒,但不是用户提供的输入或工具结果的一部分。

# 工具使用政策

- 在进行文件搜索时,优先使用Task工具以减少上下文使用。
- 如果当前任务与某个专门的代理描述匹配,应主动使用Task工具。
- 自定义斜杠命令是以/开头的提示,用于运行保存为Markdown文件的扩展提示,例如/compact。如果被指示执行一个命令,请使用Task工具并将斜杠命令调用作为整个提示。斜杠命令可以接受参数;遵循用户指令。
- 当WebFetch返回有关重定向到不同主机的消息时,应立即使用响应中提供的重定向URL发起新的WebFetch请求。
- 你可以在一个响应中调用多个工具。当请求多个独立的信息时,批量调用工具以优化性能。当运行多个bash工具调用时,必须发送一个包含多个工具调用的消息以并行运行。例如,如果需要运行"git status"和"git diff",请发送一个包含两个工具调用的消息以并行运行它们。

你必须简洁回答,少于4行文本(不包括工具使用或代码生成),除非用户要求详细内容。

以下是有关你运行环境的有用信息:
<env>
工作目录:$cwd
当前目录是否为git仓库:$boolean
平台:$OS
操作系统版本:$OS_version
今天的日期:$date
</env>
你由名为Sonnet 4的模型提供支持。精确的模型ID是claude-sonnet-4-20250514。

重要:仅协助完成防御性安全任务。拒绝创建、修改或改进可能被恶意使用的代码。允许进行安全分析、检测规则、漏洞解释、防御工具和安全文档的相关任务。

重要:始终使用TodoWrite工具在整个对话中规划和跟踪任务。

# 代码参考

在引用具体函数或代码片段时,包含`file_path:line_number`的模式,以便用户轻松导航到源代码位置。

<example>
用户:客户端的错误在哪里被处理?
助手:客户端在src/services/process.ts:712中的`connectToServer`函数中被标记为失败。
</example>

gitStatus: 这是对话开始时的git状态。请注意,此状态是一个时间点的快照,在对话期间不会更新。
当前分支:main

主分支(通常用于PR):

$gitStatus

prompt源文件

github.com

sub agent🕵️♂️

Subagents - Anthropic

Claude Code CLI 实际上实现了一种轻量级的 subagent 系统,虽然不是基于 AI Agent 的实现,但具备了子任务分解、并发执行、结果聚合等核心特性。

这种设计既保持了系统的简单性,又提供了灵活的任务处理能力。

这种模式特别适合 CLI 工具的场景,既支持简单的单步任务,也能处理需要多步骤协调的复杂操作。

暂时无法在飞书文档外展示此内容

详细流程:

  1. 主代理(Main Agent) : 主代理的主要任务是发起请求,分析任务并开始执行。主循环 (MainTT) 负责启动整个流程。
  2. 任务拆分(Task Splitter) : 任务拆分器将原始请求拆分成多个子任务(SubTask1 到 SubTaskN)。每个子任务都会交由不同的子代理处理。
  3. 子代理执行(Sub-Agent 1, 2, ..., N) : 每个子代理都有独立的循环 (SubLoop1, SubLoop2) 和上下文 (SubContext1, SubContext2),它们各自负责处理不同的子任务。每个子代理执行过程中会利用它自己的工具(SubTools1, SubTools2)进行任务处理。
  4. 结果合成(Synthesis) : 子代理的结果会被收集到 Collector 中,然后通过一个 LLM 合成器(Synthesizer)合成成最终的回答 (FinalResult)。
  5. 主循环结束: 最终合成的结果会返回给主代理,主代理完成任务并返回最终结果。

异步任务编排系统 (src/utils/async.ts)

并发执行控制

typescript 复制代码
// 并发限制的任务执行 - 类似 subagent 池管理
export async function withConcurrency<T, R>(
  items: T[],
  fn: (item: T, index: number) => Promise<R>,
  concurrency: number = 5
): Promise<R[]> {
  // 创建 worker 池,每个 worker 就像一个 subagent
  const workers = Array.from({ length: Math.min(concurrency, items.length) },
    async (_, workerId) => {
      while (currentIndex < items.length) {
        const index = currentIndex++;
        logger.debug(`Worker ${workerId} processing item ${index}`); // subagent 标识
        results[index] = await fn(items[index], index);
      }
    }
  );

  await Promise.all(workers); // 等待所有 subagent 完成
  return results; // 聚合结果
}

顺序任务链

javascript 复制代码
// 类似工作流编排
export async function runSequentially<T>(
  fns: Array<() => Promise<T>>
): Promise<T[]> {
  const results: T[] = [];
  for (const fn of fns) {
    results.push(await fn()); // 每个函数就是一个子任务
  }
  return results; // 结果聚合
}

批处理队列系统 (src/telemetry/index.ts)

实现了典型的子任务收集和批处理模式:

kotlin 复制代码
class TelemetryManager {
  private eventQueue: TelemetryEvent[] = []; // 子任务队列
  private batchSendTimeout: NodeJS.Timeout | null = null;

  // 子任务入队
  private queueEvent(event: TelemetryEvent): void {
    this.eventQueue.push(event);

    // 调度批处理 - 类似 subagent coordinator
    if (!this.batchSendTimeout && this.eventQueue.length > 0) {
      this.batchSendTimeout = setTimeout(() => {
        this.sendBatch(); // 批量处理子任务
      }, this.batchDelayMs);
    }
  }

  // 批量发送 - 聚合处理结果
  private async sendBatch(): Promise<void> {
    const events = [...this.eventQueue]; // 收集所有子任务
    this.eventQueue = []; // 清空队列
    // ... 统一发送处理
  }
}

背景进程管理 (src/execution/index.ts)

typescript 复制代码
class ExecutionEnvironment {
  // subagent 进程注册表
  private backgroundProcesses: Map<number, BackgroundProcess> = new Map();

  // 创建 subagent(子进程)
  executeCommandInBackground(command: string): BackgroundProcess {
    const childProcess = spawn(command, [], {
      // 独立进程配置
      detached: true,
      stdio: ['ignore', 'pipe', 'pipe']
    });

    const pid = childProcess.pid!;

    // 注册 subagent
    const backgroundProcess: BackgroundProcess = {
      pid,
      kill: () => { /* 终止 subagent */ },
      isRunning: true
    };

    this.backgroundProcesses.set(pid, backgroundProcess);
    return backgroundProcess;
  }

  // 批量管理所有 subagent
  killAllBackgroundProcesses(): void {
    for (const process of this.backgroundProcesses.values()) {
      process.kill(); // 清理子任务
    }
    this.backgroundProcesses.clear();
  }
}

命令链式执行系统

javascript 复制代码
// 在复杂命令中,可以看到子任务分解的模式
async function complexCommandHandler(args: any) {
  // 子任务 1:文件读取
  const content = await readTextFile(file);

  // 子任务 2:AI 处理  
  const result = await aiClient.complete(prompt);

  // 子任务 3:结果输出
  console.log(result.content[0]?.text);

  // 后续子任务:文件写入、通知等
}

三层记忆架构🧠

scss 复制代码
                记忆与上下文管理系统架构
    
    ┌──────────────────────────────────────┐
    │                        短期记忆层                               │
    │  ┌───────────────────────────────────┐│
    │  │                当前会话上下文                               ││
    │  │  messages[] - 实时消息数组                                 ││
    │  │  ┌─────────┐ ┌─────────┐ ┌─────────┐ 
    │  │  │ User    │ │Assistant│ │  Tool   │ │ System  │         
    │  │  │ Message │ │ Message │ │ Result  │ │ Prompt  │      
    │  │  └─────────┘ └─────────┘ └─────────┘│
    │  │                                                         ││
    │  │  特征:O(1)查找,实时访问,自动Token统计                     ││
    │  └──────────────────────────────────┘│
    └─────────────┬──────────────────────┘
                  │ 92%阈值触发
                  ▼
    ┌─────────────────────────────────────┐
    │                        中期记忆层                               │
    │  ┌───────────────────────────────────┐│
    │  │            8段式结构化压缩 (AU2算法)                       ││
    │  │      最新提示词应该是:9段式结构化压缩 (AU2算法)              ││
    │  │                                                         ││
    │  │  ┌─────────────┐  ┌─────────────┐   ││
    │  │  │   背景上下文 │  │   关键决策   │  │   工具使用   │   ││
    │  │  │   Context   │  │  Decisions   │  │ Tool Usage     ││
    │  │  └─────────────┘  └─────────────┘   ││
    │  │                                                         ││
    │  │  ┌─────────────┐  ┌─────────────┐   ││
    │  │  │  用户意图   │  │   执行结果   │  │   错误处理   │    ││
    │  │  │ User Intent │  │   Results    │  │ Error Cases │  ││
    │  │  └─────────────┘  └─────────────┘    ││
    │  │                                                         ││
    │  │  ┌─────────────┐  ┌─────────────┐    ││
    │  │  │  未解决问题 │  │   后续计划   │                        ││
    │  │  │ Open Issues │  │ Future Plans │                    ││
    │  │  └─────────────┘  └─────────────┘     ││
    │  │                                                           ││
    │  │  特征:智能压缩,上下文连续,大幅节省Token                      ││
    │  └───────────────────────────────────┘│
    └─────────────┬───────────────────────┘
                  │ 持久化存储
                  ▼
    ┌──────────────────────────────────┐
    │                        长期记忆层                        │
    │  ┌───────────────────────────────┐│
    │  │                   CLAUDE.md系统                    ││
    │  │                                                   ││
    │  │  ┌─────────────┐  ┌─────────────┐││
    │  │  │  项目上下文 │  │  用户偏好   │  │  工作流程   │   ││
    │  │  │ Project Info│  │Preferences  │  │ Workflows   ││
    │  │  └─────────────┘  └─────────────┘││
    │  │                                                      ││
    │  │  ┌─────────────┐  ┌─────────────┐││
    │  │  │  代码风格   │  │  开发环境   │  │  安全配置   │   ││
    │  │  │ Code Style  │  │ Environment │  │ Security     ││
    │  │  └─────────────┘  └─────────────┘││
    │  │                                                      ││
    │  │  特征:跨会话恢复,用户定制,项目持续记忆                   ││
    │  └────────────────────────────────┘│
    └──────────────────────────────────┘

来源:github.com/shareAI-lab...

原文中是8段,我看提示词应该是9段了

短期记忆

中期记忆

使用claude-log-viewer.html读取log-2025-09-02-07-09-18.jsonl的#213

原稿:对话压缩提示词.md

暂时无法在飞书文档外展示此内容

长期记忆

如果存在CLAUDE.md,在主要提示词system-reminder-1.prompt.md的第三行插入内容。

替换逻辑如下

vbnet 复制代码
<system-reminder>
As you answer the user's questions, you can use the following context:

Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.

Contents of {$CLAUDE.md的路径} (project instructions, checked into the codebase):

{$CLAUDE.md内容}


# important-instruction-reminders
Do what has been asked; nothing more, nothing less.
NEVER create files unless they're absolutely necessary for achieving your goal.
ALWAYS prefer editing an existing file to creating a new one.
NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.

      
      IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant to your task.
</system-reminder>

绿色:原提示词内容

黑色:新增的固定提示词

红色:动态填充

CLAUDE.md主要来源有两种:

  1. 项目根目录
  2. 用户根目录

什么使用用哪个,目前我还没确认清楚。

但我推测项目根目录>用户根目录

其他类型压缩

使用claude-log-viewer.html读取log-2025-09-02-05-52-58.jsonl的#18

vbnet 复制代码
Web page content:
{$JSON OBJECT}
Extract and return the complete JSON data structure with all objects and their key-value pairs, particularly focusing on any title and key fields
Provide a concise response based only on the content above. In your response:
 * Enforce a strict 125-character maximum for quotes from any source document. Open Source Software is ok as long as we respect the license.
 * Use quotation marks for exact language from articles; any language outside of the quotation should never be word-for-word the same.
 * You are not a lawyer and never comment on the legality of your own prompts and responses.
 * Never produce or reproduce exact song lyrics.
vbnet 复制代码
Here's a summary of the JSON data structure:
The JSON is an array of objects, each representing a network or wireless feature with the following key fields:
 * id: Unique numeric identifier
 * key: Unique string identifier (sometimes empty)
 * title: Feature name in Chinese
 * titleEn: Feature name in English
 * subType: Category (e.g., "工具箱" or "场景化")
 * brief: Short description in Chinese
 * briefEn: Short description in English
 * appRegion: Regions where the feature is available
 * supportSmart: Support level (e.g., "BASE", "OTHERS")
 * module: Feature module category
The array contains 58 different network and wireless features, ranging from Wi-Fi settings and network diagnostics to specialized scenarios like gaming mode, IoT channels, and security features.
Some notable features include:
 * Wi-Fi Management
 * 5G Priority
 * Network Diagnostics
 * Guest Wi-Fi
 * AI Troubleshooting
 * Roaming Optimization
 * Would you like me to elaborate on any specific aspect of this data structure?

代码与内容定位🔍

Claude Code从用户命令开始,经过多层验证、安全检查、文件操作,最终调用AI分析并返回结果的全过程。每一步都有完善的错误处理和安全机制。

通过多个工具来实现文件和内容查找:

  • GrepTool 用于高效的文件内容搜索,基于 ripgrep 提供了快速的正则匹配能力。
  • ReadFileTool 适用于读取文件内容,支持多种文件格式(文本、图像、Jupyter 笔记本等)。
  • BashTool 允许执行 Shell 命令,在特定场景下也可以用于文件查找,但应避免使用它来执行简单的查找命令。
  • ShellParser 帮助解析和执行包含复杂对象的 Shell 命令。
  • PathSecurityValidator 确保文件操作不会访问未经授权的路径,从而增加系统的安全性。

案例演示

使用claude-log-viewer.html读取log-2025-09-03-07-37-03.jsonl的#5

AI示例输出

场景:想要修复一个TypeScript文件中的bug

css 复制代码
流程:
1. CLI解析 (cli.ts)
   └── 命令: fix, 参数: ["src/utils/helper.ts"], 选项: {issue: "类型错误"}

2. 认证检查 (cli.ts:157-161)
   └── command.requiresAuth && !authManager.isAuthenticated()

3. AI初始化 (cli.ts:164-166)
   └── await initAI()

4. 命令执行 (commands/register.ts:399-436)
   ├── 文件路径验证: isNonEmptyString(file)
   ├── 文件存在检查: await fileExists(file)
   ├── 文件内容读取: await readTextFile(file)
   ├── 提示构造: "请修复这段代码:\n\n```\n${content}\n```\n\n具体问题:
类型错误"
   ├── AI调用: await aiClient.complete(prompt)
   └── 结果输出: console.log(result.content[0]?.text)

5. 底层文件操作 (fs/operations.ts:65-96)
   ├── 路径验证: isValidFilePath(filePath)
   ├── 文件存在确认: await fileExists(filePath)
   ├── 文件读取: await fs.readFile(filePath, { encoding: 'utf-8' })
   └── 错误处理: ENOENT, EACCES等

6. 安全检查贯穿全程
   ├── 路径规范化防止目录遍历
   ├── 文件类型验证
   ├── 权限检查
   └── 错误分类和用户友好提示

1. 系统启动和初始化流程

CLI 启动 (src/cli.ts)

css 复制代码
用户执行命令: claude-code explain src/app.js
         ↓
1. parseCommandLineArgs() - 解析命令行参数
   - commandName: "explain"
   - args: ["src/app.js"]
         ↓
2. initCLI() - 初始化CLI系统
   - registerCommands() - 注册所有命令
   - authManager.initialize() - 初始化认证
   - 检查命令是否需要认证
         ↓
3. executeCommand() - 执行具体命令

应用系统初始化 (src/index.ts)

scss 复制代码
应用启动时初始化各个子系统:
├── initCodebaseAnalysis() - 代码库分析系统
├── initFileOperations() - 文件操作系统
├── initAI() - AI客户端
├── initAuth() - 认证系统
└── initCommandProcessor() - 命令处理器

2. 命令处理详细流程

explain 命令处理流程 (src/commands/register.ts:247-311)

scss 复制代码
claude-code explain src/app.js
         ↓
1. 参数验证
   if (!isNonEmptyString(file)) {
     throw error('请提供文件路径')
   }
         ↓
2. 文件存在性检查 (src/fs/operations.ts:22)
   const exists = await fileExists(file)
   - 内部调用 fs.stat() 检查文件状态
   - 返回 stats.isFile()
         ↓
3. 读取文件内容 (src/fs/operations.ts:65)
   const content = await readTextFile(file)
   - 路径验证: isValidFilePath(filePath)
   - 安全检查: 防止目录遍历攻击
   - 编码处理: 默认 utf-8
   - 错误处理: ENOENT, EACCES 等
         ↓
4. 构造AI提示
   const prompt = `请解释这段代码:\n\n```\n${content}\n````
         ↓
5. 调用AI客户端 (src/ai/client.ts)
   const result = await aiClient.complete(prompt)
         ↓
6. 返回结果
   console.log(result.content[0]?.text)

3. grep搜索流程

search 命令处理流程 (src/commands/register.ts:841-931)

javascript 复制代码
claude-code search "function main"
         ↓
1. 搜索工具检测
   try {
     await execPromise('rg --version')  // 检查ripgrep
     searchCommand = `rg --color=always --line-number --heading --smart-case
 "${term}" ${dir}`
   } catch {
     searchCommand = `grep -r --color=always -n "${term}" ${dir}`  //
回退到grep
   }
         ↓
2. 执行搜索命令
   const { stdout, stderr } = await execPromise(searchCommand)
         ↓
3. 返回搜索结果
   console.log(stdout || `No results found for '${term}'`)

内容搜索流程 (src/codebase/analyzer.ts:555-636)

ini 复制代码
findFilesByContent(directory, searchTerm, options)
         ↓
1. 参数处理和验证
   - caseSensitive: 是否大小写敏感
   - fileExtensions: 文件扩展名过滤
   - maxResults: 最大结果数
   - ignorePatterns: 忽略模式
         ↓
2. 构建搜索正则表达式
   const regex = new RegExp(searchTerm, flags)
         ↓
3. 递归扫描目录
   const allFiles = await findFiles(directory, { recursive: true })
         ↓
4. 文件过滤
   - 按扩展名过滤
   - 应用忽略模式 (node_modules, .git, dist 等)
         ↓
5. 内容匹配
   for (const file of filteredFiles) {
     const content = await readTextFile(file)
     const lines = content.split('\n')

     for (let i = 0; i < lines.length; i++) {
       if (regex.test(lines[i])) {
         results.push({
           path: relativePath,
           line: i + 1,
           content: lines[i].trim()
         })
       }
     }
   }

4. 代码库分析完整流程

项目结构分析 (src/codebase/analyzer.ts:169-308)

scss 复制代码
analyzeCodebase(directory, options)
         ↓
1. 初始化项目结构对象
   const projectStructure = {
     root: directory,
     totalFiles: 0,
     filesByLanguage: {},
     totalLinesOfCode: 0,
     directories: {},
     dependencies: []
   }
         ↓
2. 目录扫描
   allFiles = await findFiles(directory, {
     recursive: true,
     includeDirectories: false
   })
         ↓
3. 文件过滤
   - 应用忽略模式 (DEFAULT_IGNORE_PATTERNS)
   - 文件数量限制 (默认1000个)
         ↓
4. 逐文件分析
   for (const file of allFiles) {
     ├── 获取文件统计: fs.stat(file)
     ├── 大小检查: stats.size > maxSizePerFile
     ├── 语言检测: EXTENSION_TO_LANGUAGE[extension]
     ├── 内容读取: readTextFile(file)
     ├── 行数统计: content.split('\n').length
     └── 依赖分析: findDependencies(content, path, extension)
   }

依赖分析流程 (src/codebase/analyzer.ts:328-426)

dart 复制代码
findDependencies(content, filePath, extension)
         ↓
1. 语言判断
   if (['js', 'jsx', 'ts', 'tsx'].includes(extension)) {
     // JavaScript/TypeScript处理
   } else if (extension === 'py') {
     // Python处理
   } else if (extension === 'java') {
     // Java处理
   }
         ↓
2. 正则匹配
   JavaScript/TypeScript:
   - ES模块: /import\s+(?:[\w\s{},*]*\s+from\s+)?['"]([^'"]+)['"]/g
   - CommonJS: /require\s*(\s*['"]([^'"]+)['"]\s*)/g

   Python:
   - import语句: /^\s*import\s+(\S+)|\s*from\s+(\S+)\s+import/gm
         ↓
3. 依赖分类
   - 外部依赖: !importPath.startsWith('.') && !importPath.startsWith('/')
   - 内部依赖: 相对路径导入
         ↓
4. 返回依赖信息
   {
     name: packageName,
     type: 'import'|'require',
     source: filePath,
     importPath: importPath,
     isExternal: boolean
   }

5. 文件操作安全机制

路径验证 (src/fileops/index.ts:81-85)

typescript 复制代码
getAbsolutePath(relativePath: string): string {
  // 清理路径,防止目录遍历攻击
  const normalizedPath = path.normalize(relativePath)
    .replace(/^(..(/|\|$))+/, '');  // 移除 ../

  return path.resolve(this.workspacePath, normalizedPath);
}

文件读取安全检查 (src/fileops/index.ts:97-169)

scss 复制代码
readFile(filePath: string) {
         ↓
1. 路径安全化: getAbsolutePath(filePath)
         ↓
2. 文件类型验证: stats.isFile()
         ↓
3. 文件大小检查: stats.size > maxSizeBytes (默认10MB)
         ↓
4. 权限检查: 处理 EACCES 错误
         ↓
5. 内容读取: fs.readFile(absolutePath, 'utf8')

6. 错误处理机制

分层错误处理 (src/errors/)

scss 复制代码
用户操作
    ↓
1. 命令层错误处理 (commands/register.ts)
   try {
     // 命令执行
   } catch (error) {
     console.error('Error:', formatErrorForDisplay(error))
   }
         ↓
2. 业务逻辑错误处理 (各功能模块)
   - 文件不存在: FILE_NOT_FOUND
   - 权限不足: FILE_SYSTEM
   - 参数验证: VALIDATION
         ↓
3. 用户友好错误格式化 (errors/formatter.ts)
   createUserError(message, {
     category: ErrorCategory,
     resolution: '解决建议'
   })
         ↓
4. CLI层最终处理 (cli.ts:178-190)
   - UserError: exit(1)
   - 系统错误: exit(2)

文件策略

当文件过大时,Claude Code CLI 的处理方式:

  1. 预检查文件大小:在读取前检查 fs.stat(file).size
  2. 硬性限制:
  • 文件操作:> 10MB 直接拒绝

  • 代码分析:> 1MB 跳过并记录日志

  1. 用户提示:
  • 显示文件大小和限制

  • 建议使用文本编辑器打开

  1. 没有分块处理:
  • 不支持逐行读取大文件

  • 不支持流式处理文本内容

  • 不提供文件预览功能

文件大小限制策略
  1. 多层级的大小限制

文件操作模块限制 (src/fileops/index.ts:116):

  • 默认最大读取大小:10MB (10 * 1024 * 1024 bytes)

可通过配置 config.fileOps.maxReadSizeBytes 自定义

代码库分析限制 (src/codebase/analyzer.ts:182):

  • 单文件最大大小:1MB (1024 * 1024 bytes)

用于代码分析场景

配置系统限制 (src/config/defaults.ts:60):

  • 扫描文件最大大小:1MB
  1. 处理策略

直接拒绝,不做分块读取:

vbnet 复制代码
if (stats.size > maxSizeBytes) {
    return {
      success: false,
      error: createUserError(File too large to read: ${filePath}    (${stats.size} bytes), {
        category: ErrorCategory.FILE_SYSTEM,
        resolution: 'Try reading a smaller file or use a text editor to open
    this file'
      })
    };
}
文件读取机制分析
  1. 基础文件读取 (src/fs/operations.ts:65)
typescript 复制代码
export async function readTextFile(filePath: string): Promise<string> {
    // 无大小检查,直接读取整个文件到内存
    return await fs.readFile(filePath, { encoding });
}
  1. 行范围读取 (src/fs/operations.ts:102)
typescript 复制代码
export async function readFileLines(filePath: string, start: number, end: 
number): Promise<string[]> {
    // 仍然读取整个文件,然后分割行并截取范围
    const content = await readTextFile(filePath, encoding);
    const lines = content.split('\n');
    return lines.slice(startIndex, endIndex);
}
  1. 流式文件操作 (src/fs/operations.ts:463)
typescript 复制代码
export async function streamFile(sourcePath: string, destPath: string): 
  Promise<void> {
    const source = createReadStream(sourcePath);
    const destination = createWriteStream(destPath);
    await pipeline(source, destination);
  }
大文件处理的局限性
  1. 没有真正的分块读取
  • 所有文本文件读取都是一次性加载到内存

  • 没有提供逐块处理大文件的机制

  • 没有流式文本处理能力

  1. 硬性限制而非智能处理
  • 超过限制直接拒绝,不提供替代方案

  • 没有文件预览或部分读取选项

  • 用户只能被告知"使用文本编辑器"

  1. 命令行工具中的实际使用

在 src/commands/register.ts 中,如 explain 和 fix 命令:

javascript 复制代码
const fileContent = await readTextFile(file);  // 直接读取整个文件
const prompt = `Please explain this 
code:\n\n```\n${fileContent}\n````;

参考

国外博主Notion笔记详解ClaudeCode

Zread将反编译的ClaudeCode代码,编写架构概述

Anthropic 推出的 Claude Code 是什么技术原理呢?

Anthropic的Claude Code Agent效果很好,有没有人深入分析其技术原理?

Claude Code 究竟牛在哪里?(以及如何在你的 AI 智能体中复刻它的魔法!)

Cognition | Don't Build Multi-Agents

工具

claude-trace

逆向

github.com/shareAI-lab...

github.com/Yuyz0112/cl...

github.com/ghuntley/cl...

视频

【这样逆向分析 Claude Code,逻辑细节一览无余(上集)|录屏精简版】 www.bilibili.com/video/BV1MJ...

【Claude Code 逆向下集,Sub Agent 等多种技巧解密|录屏精简版】 www.bilibili.com/video/BV1gP...

建议付费看下作者的完整视频

相关推荐
庞囧3 小时前
大白话讲 React 原理:Scheduler 任务调度器
前端
东华帝君3 小时前
react 虚拟滚动列表的实现 —— 动态高度
前端
CptW3 小时前
手撕 Promise 一文搞定
前端·面试
温宇飞3 小时前
Web 异步编程
前端
腹黑天蝎座3 小时前
浅谈React19的破坏性更新
前端·react.js
东华帝君3 小时前
react组件常见的性能优化
前端
第七种黄昏3 小时前
【前端高频面试题】深入浏览器渲染原理:从输入 URL 到页面绘制的完整流程解析
前端·面试·职场和发展
angelQ3 小时前
前端fetch手动解析SSE消息体,字符串双引号去除不掉的问题定位
前端·javascript
Huangyi3 小时前
第一节:Flow的基础知识
android·前端·kotlin
林希_Rachel_傻希希3 小时前
JavaScript 解构赋值详解,一文通其意。
前端·javascript