Skip to main content

TEAMMEM — 团队共享记忆

Feature Flag: FEATURE_TEAMMEM=1 实现状态:完整可用(需要 Anthropic OAuth + GitHub remote) 引用数:51

一、功能概述

TEAMMEM 实现基于 GitHub 仓库的团队共享记忆系统。memory/team/ 目录中的文件双向同步到 Anthropic 服务器,团队所有认证成员可共享项目知识。

核心特性

  • 增量同步:只上传内容哈希变化的文件(delta upload)
  • 冲突解决:基于 ETag 的乐观锁 + 412 冲突重试
  • 密钥扫描:上传前检测并跳过包含密钥的文件(PSR M22174)
  • 路径穿越防护:所有写入路径验证在 memory/team/ 边界内
  • 分批上传:自动拆分超过 200KB 的 PUT 请求避免网关拒绝

二、用户交互

同步行为

API 端点

三、实现架构

3.1 同步状态

3.2 Pull 流程(Server → Local)

文件:src/services/teamMemorySync/index.ts:770-867

3.3 Push 流程(Local → Server)

文件:src/services/teamMemorySync/index.ts:889-1146

3.4 密钥扫描

文件:src/services/teamMemorySync/secretScanner.ts 使用 gitleaks 规则模式扫描文件内容。检测到密钥时:
  • 跳过该文件(不上传)
  • 记录 tengu_team_mem_secret_skipped 事件(仅记录规则 ID,不记录值)
  • 不阻止其他文件同步

3.5 文件监视

文件:src/services/teamMemorySync/watcher.ts 监视 memory/team/ 目录变更,触发自动 push。抑制由 pull 写入引起的假变更。

3.6 路径安全

文件:src/memdir/teamMemPaths.ts
  • validateTeamMemKey(relPath) — 验证相对路径不超出 memory/team/ 边界
  • getTeamMemPath() — 返回 team memory 根目录路径

四、关键设计决策

  1. Server-wins on pull, Local-wins on push:pull 时服务端内容覆盖本地;push 时本地编辑覆盖服务端。本地用户正在编辑,不应被静默丢弃
  2. Delta upload:只上传哈希变化的条目,节省带宽。首次 push 为全量,后续增量
  3. 分批 PUT:单次 PUT ≤200KB,避免 API 网关(~256-512KB)拒绝。每批独立 upsert,部分失败不影响已提交批次
  4. 密钥扫描在上传前:PSR M22174 要求密钥永不离开本机。扫描在 readLocalTeamMemory 中执行,密钥文件不进入上传集
  5. ETag 乐观锁:push 使用 If-Match header。412 时 probe ?view=hashes(只获取 checksums,不下载内容),刷新后重试
  6. 服务端容量动态学习:不假设客户端容量上限,从 413 的 extra_details.max_entries 学习

五、使用方式

六、外部依赖

七、文件索引