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