跳转至

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 在光标当前位置与行首之间跳转。