2026-04-16 学习日志
今日主题
- Claude Code CLAUDE.md @path include 机制深入
- Claude Code IDE 选区注入机制
- Claude Code wrapMessagesInSystemReminder 语义
- Cloudflare Durable Objects 与 WebSocket 房间
- Cloudflare Containers 与 FaaS/Serverless 边界
- Readline / Emacs 风格终端快捷键
新增认知
Claude Code CLAUDE.md @path include 机制深入
- @path 在 CLAUDE.md 里不是原地替换,而是追加独立条目:processMemoryFile() 先 push 主文件,再递归 push 被 include 的文件,两者是平级的 MemoryFileInfo[] 条目
- @path 字面量会原样留在主文件 content 中(parseMemoryFileContent 只剥离 frontmatter 和 HTML 注释,不处理 @path 文本)
- getClaudeMds() 把每个 MemoryFileInfo 格式化为 'Contents of (): ',LLM 通过这个 header 而非 @path 文本来识别内容来源
- 最终 CLAUDE.md 内容不是注入 system prompt,而是通过 prependUserContext() 作为第一条 isMeta:true 的 user message 插入,格式为 ...# claudeMd...
Claude Code IDE 选区注入机制
- IDE 插件通过 MCP 协议推送 selection_changed notification,携带 selection.start/end、text、filePath
- useIdeSelection.ts 监听该 notification,计算 lineCount/lineStart,存入 React state(IDESelection)
- 用户提交 prompt 时,getSelectedLinesFromIDE() 将 IDESelection 转为 selected_lines_in_ide 类型的 Attachment
- TUI 渲染为 ⧉ Selected N lines from in ;注入 LLM 时包成 user message
Claude Code wrapMessagesInSystemReminder 语义
- 底层只是 \n${content}\n 的字符串包裹
- 作用是配合 system prompt 中的说明告知 LLM:这段内容是 harness 层注入的背景信息,不是用户的真实意图表达
- 使用场景:所有 Attachment 类型(文件内容、IDE 选区、hook 上下文等)以及 userContext(CLAUDE.md、git status)都经由此标签注入
Cloudflare Durable Objects 与 WebSocket 房间
- Durable Object 更接近按 key 路由的有状态 Actor,而不只是“带分布式锁的 Worker”;锁感只是其“同一 key 由唯一实例串行处理状态”的外在表现。
- Worker 到 Durable Object 的 stub 调用应按远程调用心智模型设计:创建 stub 不发请求,真正执行 stub.fetch(...) 或 stub.method() 才触发 Cloudflare 平台内部 RPC/路由。
- WebSocket 房间建连阶段走的是 HTTP Upgrade 语义,因此最自然的入口是 stub.fetch(request) 而不是 RPC 方法;连接建立后,后续消息由 DO 直接托管,不再逐条经过外层 Worker 中转。
- Cloudflare 在 runtime 层对 Durable Objects 和 WebSocket 做了专门集成:应用代码并未直接操作底层 TCP,而是通过 WebSocketPair、acceptWebSocket() 和 101 响应声明“由哪个 DO 接管这条连接”。
- 删除 DO 的业务语义通常不是手动销毁实例,而是清空该对象的持久存储、关闭其连接并停止继续路由到该 key,实例随后由 runtime 自然失活。
Cloudflare Containers 与 FaaS/Serverless 边界
- Cloudflare Containers 本质上是兼容 Docker 镜像的无服务器容器:能运行需要完整 Linux 环境、文件系统和系统库的程序,但生命周期由平台托管,不等同于传统主机上的常驻 Docker 容器。
- Cloudflare Containers 处于 FaaS 与传统长驻容器之间:它按需启动、可短时保活、空闲后休眠,适合把 Worker 作为边缘入口,把容器作为重计算或现成服务的执行后端。
- FaaS 是 Serverless 的子集。Serverless 关注的是不自己管理服务器这一交付模式;FaaS 关注的是以函数为单位、由事件触发的短生命周期执行模型。Serverless 容器属于 Serverless,但不是典型 FaaS。
Readline / Emacs 风格终端快捷键
- 终端里的 ctrl+a/e/p/n/r 等快捷键来自 GNU Readline 库,基于 Emacs 键位风格,bash/zsh 及大多数 CLI 应用均支持;macOS 系统级文本框(Safari、备忘录等)也原生支持,因为 Cocoa 文本系统内置了这套绑定。
- ctrl+r 的'反向'指从最近历史往前搜索(而非从最早往后);'增量'指每多输一个字符结果立即更新,无需回车触发——本质是把搜索和输入解耦,实时缩小候选集。
- ctrl+x 在 Readline 中是前缀键,必须跟第二个键才触发动作:ctrl+x ctrl+e 可将当前命令行丢进 $EDITOR 编辑后执行,适合命令过长时使用;ctrl+x ctrl+x 在光标当前位置与行首之间跳转。