Appearance
功能规格说明:会话文件保留清理
创建日期:2026-08-22
澄清
2026-08-22 决策确认(用户拍板)
- 触发位置:
setupAgentContainer(containerSetup.ts)fire-and-forget 后台执行,模块级 flag 保证每进程只扫一次(对齐 CC「启动时后台执行一次」) - 旧机制:删除
cleanupExpiredSessionsFromJsonl(14 天硬编码、per-workdir、session restore 时触发),统一由新的全局 30 天清理覆盖 cleanupPeriodDays: 0:跳过清理(永不删除会话文件),防止 cutoff=now 误删全部历史- 配置范围:user → project → local 三 scope 合并(last-wins),与其他 scalar 配置(language/model 等)模式一致
用户场景与测试 (必填)
用户故事:过期会话文件后台清理(优先级:P1,对齐 Claude Code)
作为用户,我希望过期的会话记录被自动清理,以便 ~/.wave/projects 不会无限膨胀。
为什么是这个优先级:对齐 Claude Code 的 cleanupOldSessionFiles()(默认 30 天保留期),是磁盘占用治理的基础能力;当前 jsonl 仅靠 14 天 per-workdir 清理兜底,无法覆盖全部项目目录。
独立测试:可以构造一个含旧 jsonl(mtime 早于 cutoff)与新 jsonl(mtime 晚于 cutoff)的项目目录,执行清理函数,验证只有旧文件被删除、新文件保留、删除计数正确。
验收场景:
- 假设
~/.wave/projects下存在 mtime 早于保留期 cutoff 的会话 jsonl(主会话<uuid>.jsonl与子代理subagent-<uuid>.jsonl),当启动时后台清理执行,则这些文件必须被删除 - 假设会话 jsonl 的 mtime 晚于 cutoff,当清理执行,则该文件必须被保留(jsonl 追加写会使 mtime 反映最后活动时间,与 CC 的文件 mtime 判断一致)
- 假设项目目录在清理后为空,当清理执行完毕,则空项目目录必须被删除;目录中仍有文件(如
memory/)时必须保留 - 假设
~/.wave/projects目录不存在或不可读,当清理执行,则必须静默跳过,不得报错中断启动
用户故事:可配置保留期(优先级:P1,对齐 Claude Code)
作为用户,我希望通过 settings.json 的 cleanupPeriodDays 控制保留天数,以便按需延长或缩短会话保留期。
为什么是这个优先级:对齐 CC 的 settings.cleanupPeriodDays ?? DEFAULT_CLEANUP_PERIOD_DAYS(30);默认 30 天,用户可覆盖。
独立测试:可以在 settings.json 中设置 cleanupPeriodDays 为不同值,验证清理 cutoff 随之变化;设置 0 时验证清理整体跳过。
验收场景:
- 假设用户未设置
cleanupPeriodDays,当清理执行,则保留期必须为默认 30 天 - 假设用户在
~/.wave/settings.json设置cleanupPeriodDays: 60,当清理执行,则保留期必须为 60 天(仅删 mtime 早于 60 天前 cutoff 的文件) - 假设用户设置
cleanupPeriodDays: 0,当清理执行,则必须跳过清理,不得删除任何会话文件 - 假设project/local scope 的 settings.json 也设置了
cleanupPeriodDays,当清理执行,则按 user → project → local 优先级取最后一个非 undefined 值(last-wins)
用户故事:误删守卫(优先级:P1,对齐 Claude Code)
作为用户,我希望在 settings 配置异常时清理被安全跳过,以便不会因解析失败导致会话被误删。
为什么是这个优先级:对齐 CC 的守卫(getSettingsWithAllErrors().errors.length > 0 && rawSettingsContainsKey('cleanupPeriodDays') → 跳过清理);用户显式设过保留期时,配置损坏回退默认值可能删除用户本想保留的文件。
独立测试:可以构造「settings.json 校验失败且含 cleanupPeriodDays 键」与「校验失败但无该键」两种场景,验证前者跳过清理、后者按默认值清理。
验收场景:
- 假设settings 校验存在错误且用户显式设置过
cleanupPeriodDays,当启动触发清理,则必须整体跳过清理(日志提示修复 settings 后清理才会启用) - 假设settings 校验存在错误但用户未设置
cleanupPeriodDays,当启动触发清理,则按默认 30 天执行(用户未表达保留意图,默认值安全) - 假设settings 文件为损坏的 JSON(无法解析),当启动触发清理,则必须跳过清理,不得基于残缺配置删除任何文件
- 假设清理仅记录删除/错误计数并输出 debug 日志,当执行完毕,则不得抛出异常影响 Agent 启动
用户故事:auto-memory 保护(优先级:P1)
作为用户,我希望会话清理只删除 jsonl 会话文件,不触碰项目的 auto-memory 文件,以便长期记忆不丢失。
为什么是这个优先级:~/.wave/projects/<project>/memory/ 存放 auto-memory(MEMORY.md 等),是跨会话记忆的载体,一旦误删无法恢复。
独立测试:可以构造含 memory/ 子目录与过期 jsonl 的项目目录,执行清理,验证 jsonl 被删、memory/ 内容完整保留、目录不被删除。
验收场景:
- 假设项目目录含
memory/子目录(内含MEMORY.md),当清理执行,则memory/及其内容必须原样保留 - 假设项目目录在删除所有过期 jsonl 后仍含
memory/,当清理执行完毕,则项目目录不得被删除(空目录清理只针对无残留内容的目录)