CC中我们能学到什么

发布时间:2026/8/24 1:48:44
CC中我们能学到什么 学习/参考资源Claudecode学习 Claude Code | Claude Code源码学习专题CoreCoder : https://github.com/he-yufeng/CoreCoderLearn-claude codehttps://github.com/shareAI-lab/learn-claude-codeCoreCoder01agent loop去支撑整个流程作业用for进行任务循环max_rounds50.流转条件是否有tool调用tool callTool遵循Open AI的function callingassistant后如果有tool_call那么一个tool—tool_call_id—tool_contenta.对应一个场景用户输入tool的输出如果有error怎么去判断是属于哪些问题1参数传递到tool函数时的error2tool执行时的errorb.当用户Ctrlc时如果恰好截断到模型调用tool和tool执行中也就是tool的输出内容对应不到tool_call_id。对于模型来说tool是执行了但没有内容。这次中断会影响整个会话。所以我们会给content:[“interrupt”]让历史重新合法然后再把异常抛上去交给上层处理。02tool的定义继承于Tool包含(name, description, parameters)执行函数excuteschema()拼接成Open AI function Calling的格式添加至tool_list中。Edit_tool的处理改动文件中的内容。a.整个修改太浪费tokenb.定位行去修改模型对行数比较模糊况且行数改动不能有偏差c.用diff/patch格式修改让模型生成带 -42,7 42,8 行号头的统一 diff及修改内容 但错误率高得让人头疼那套上下文行数和偏移量它算不准。所以我们直接定位【唯一修改内容】让其恰好出现一次。如果修改内容出现多次增加上下文使其唯一出现。最后验证让tool返回修改内容的diff给模型判断。严格的bash每个命令执行前都先过一遍rm等危险命令检测表。cd a cd b在多个cd命令上b是基于a的03Context engineer 3种压缩保障a.tool_call的返回指在当时任务有用输出结果在后续任务上没有什么可保留了所以保留前尾删除中间内容。b.对历史消息压缩成摘要但保留结构化内容而不是背景文本c.如果以上压缩还没用直接只保留前几次内容摘要大幅度删除删除的坑如果删除的位置恰好是tool_call的位置tool_id与tool_content被分割了与01的情况一致所以我们考虑移动分割边界04并行执行。claude解析用户时tools已经在执行了不必等整段响应结束回复快Corecoder是老老实实地执行。一个agent对于任务有多个tool响应我们采取执行单个就直接跑多个就交给 _exec_tools_parallel一个线a池。a.但并行不是肆无忌惮的当线程1执行保存A目录时如果线程2并行保存B那么查看A的内容就被覆盖了所以我们要为不同的线程相隔离开Python 里现成的工具是 threading.local()它给每个线程一份独立的副本线程之间互不可见。子agent的处理这里没有去显示定义子agent是通过AgentTool去定义子agent。AgentTool会指回主agent子agent能与其共享资源。我们会为子agent单独开context让主agent窗口干净只需要子agent的执行结果。b.子agent不能再调用AgentTool05在CLI中展示agent实际输出与UI展示无关安全考虑 当/save时要保存文件输入会话名但在命令行上是敲任意字符这是第一道防线直接取末尾的命名防止跳跃至其他目录下。这是第二道防线通过比较path.parent root对于上面的例子 /home/user 比较 rootClaude Code01main.tsx是“装配根”1profile checkpoint计算各性能初始化时间抢启动时间加载配置api2拉取contextcommandskilltool初始化外部能力MCPLSP去看当前session的状态搞清楚3在REPL那个交互界面启动前就准备好了上面内容02QuerEngine一个围绕会话长期存在的对象.1为什么能跨多轮次会话submitMessage()本质上就是“启动一轮 agent run”接收用户输入设置目录和session过滤tool配置prompt和上下文开启query于模型交互工具调用输出和追加history统计usage及状态.2为什么有反思/纠错能力不是简单地模型调用工具而是工具结果的回流模型根据system_prompt/history做决策决策中可能存在toolstools权限判断模型调用tool得到结果注入到history中再进行下一轮.3一次会话后什么保存了下来03上下文(1)CLAUDE.md ——通过对仓库信息项目分支记忆信息等进行过滤去重得到(2)git状态压缩机制.1优先保留结构化上下文对低价值压缩/裁剪不着急变成一段摘要.2投影一个折叠后的上下文视图自主压缩.3兜底压缩04BashToolBashTool 之所以关键并非因为它能简单地“执行命令”而是因为它将命令执行构建成了一个拥有语义分类、权限约束、任务管理和 UI 呈现的正式系统能力如何从“看懂代码”---“验证代码”Learn—Claude Code011. hook 写loop外面不拥挤在loop里HOOK表包含UserPromptSubmit上下文注入hookPreToolUsepermission日志logPostToolUselarge_outputStop…a. 对tool的权限, 用户许可/高危命令......b. 对tool工作日志的打印c. 对tool输出的判断, 是否为大文件本质上执行顺序可以一样Hook 的价值不是改变执行顺序而是把具体扩展逻辑从 Agent Loop 中解耦出来使扩展可以独立注册、增加、删除而不用修改核心loop02如果todo_write是告诉你agent要做什么task_system就是告诉你任务间的依赖Todolist1. Todo让Agent具有规划能力但不是所有的task都需要todo2. 更新任务状态: [ ] pending, [] in progress, [x] completedTask (持久化文件)创建db—创建表—测试 这个任务整体是有先后依赖的a.怎么让agent知道可以做下一个任务了c.如果退出cc任务还存在吗从 pending————in progress从 in progress————completed1. 只有当上一blockby中的task除firststatuscomplete时再next2. 一个task一个文件 .task/ task_id.json03Subagent 像tool一样执行完就endingAgent_team 持续状态的保持workIDLEshutdown ———— 多agent1.是否使用多agent由用户判断lead会提出方案用户决策2.我们知道一个task一个文件也有lead.jsonowneragent这就可以进行分配不用争抢3.初期是lead去分配agent_task但agent执行完后还有task现实肯定是task_numagent_num/ lead的回顾task空闲的agent执行任务new_tasklead_task4. agent间/lead间通过创建的持久化 .mailbox/ agent.json来传递信息5.agent执行完后反馈信息包含result/status—lead—message 同时clear_lead如果不clear下一次还有agent_team的信息重复6.由于agent_team间是并行执行的为了防止相互干扰修改内容我们在目录下创建 .git/ worktree分支7.可观测可执行。Runtime通过暴露args展示agent是否真正“做“并非接受请求8.通过创建thread一个agent一个loop去执行(task,name)04Skill / context / memory / mcpa. memory1.存储 怎么持久化存储一个记忆一个文件 .memory/ xx.json 分门别类存放personal_prefer,project…内容包含name/description/type/content…还存放 .memory/MEMORY.md 记录每个记忆的摘要每一行一个存储的文件2.召回 怎么放入对话(1)拿取最近几轮的对话进行反馈(2)先用min llm对用户输入进行MEMORY.md语义匹配拿到index(3)匹配失败将用户输入正则化拆解成关键词进行匹配memoryname,description。。。(4) 记忆作为背景知识加入, 当前请求历史记忆 (优先考虑, 不是覆盖)3.提取 怎么从上下文提取(1)llm将用户输入解析成json匹配memoryscoppersistant才存入(2)兜底用temporary memory词表去判断字段缺失也不许可4.整理 怎么优化记忆(1)当memory达到一定数量时, 重新整理知识(2) 重复记忆处理, 对比name, description, body等字段(3) 保存原文件快照防止改/删失败时, 可恢复 (先snapshaot, 再改)b. mcpmcp server拿到tool的地方—mcp client用handler去执行tool—harness1.动态tool_pool第一轮只有基础tool通过连接mcpserver拿到相应tool第二轮使用assemble_tool_pool()Tool基础tool mcp_client_tool2. mcp__{server}__{tool} 为什么要这样名命因为不同的server可能有相同的tool3. 设置permission如果mcp server提供了delete_database/trigger_deploy本质是很危险的所以harness/用户去最终确认05Background_task让 Agent 启动一个耗时任务后不要傻等把任务扔到后台, Agent 继续思考和工作等任务完成后再把结果告诉 Agent。a.只对bashtool_call的返回里带有{“name”: , “run in background”: }如果tool_namebash and run_in_backgroundTrue 则后台执行llm的语义理解判断b. 主线程bash — bg_id 后台bash — command ,所以这里一个tool有2个tool_call所以我们会将后台格式化task_notification输出告诉llm这是新的独立事件_lock threading.thread()开启线程池任务完成后不会立刻进入agent loop而是存放在result{}/_ready[]进入下一个loop06Cron scheduler 任务触发器a.让agent定时推送每日推送A. 每秒更新时间 与 任务时间比较到时间时将任务放入cron.queue等agent空闲时再交付message中_lock避免争用线程b. 到时间时first触发任务first放入队列后期不再存入队列