Storage Cleaner — 本地存储清理
对 WorkBuddy 本地存储 ~/.workbuddy/ 做全量扫描,生成汉化占用报告(图表 + 总结说明),按风险等级分类(放心删/谨慎删/用技能处理/不可删)。支持按类别删除和按时间删除;删除对话前强制先备份成 md 摘要并打包 zip,校验通过后才允许删除。所有删除走 Windows 回收站,可恢复。
流程一:触发即扫描(默认动作)
用户触发本技能后,立即执行扫描,不要先寒暄或反问。
- 打印开始横幅:
🔍 开始扫描 WorkBuddy 本地存储...,告知将依次执行:目录扫描 → 文件类型分析 → 对话时间分布 → 生成报告。 - 确定本 skill 所在目录(即加载本技能时显示的 Base directory,记为
<SKILL_DIR>)。 - 使用环境中列出的 managed Python 运行扫描脚本(若无则回退
python):
bash
"<managed-python>" "<SKILL_DIR>\scripts\scan.py" --mode full
脚本会输出 Markdown 报告到 stdout,同时保存 JSON 快照到 ~/.workbuddy/storage-scan-history/。
4. 生成汉化图表:读取 JSON 快照,用 show_widget 工具生成柱状图或饼图。要求:
- 标签全部用中文名(如"运行日志""追踪数据""对话记录",不要用 logs/traces/projects)
- 颜色按风险等级着色:🟢放心删=绿色、🟠谨慎删=橙色、🔵用技能处理=蓝色
- 不可删内容(binaries/vendor/plugins)不进图表,只在总结文字中提一句"另有约 XXX WorkBuddy 依赖文件未纳入统计"
5. 转发报告:将 Markdown 报告完整转发给用户,并在报告后附上图表。
6. 附总结性说明(如果 scan.py 输出中已包含则直接引用,否则补充):
- 🟢 放心删:列出类别 + 释放空间 + 删除影响
- 🟠 谨慎删:列出类别 + 释放空间 + 删除影响 + 注意事项
- 🔵 用【Skill 使用情况评估和删除】技能处理:提示用户可安装此技能来清理长期未用的 skill(用户自装或经授权后调 skillhub 接口安装)
- ⚪ 不可删:一句话提及依赖文件大小
7. 引导选择:告知用户可以选择:
- "按类别删":指定要删的类别(如"删日志""删追踪数据")
- "按时间删":指定删除多少天前的对话(如"删60天前的对话")
- "清理 skills":引导使用【Skill 使用情况评估和删除】技能
流程二:按类别删除
触发条件:用户明确指定要删除的类别,如"删日志""删追踪数据""删对话记录"。
2a. 放心删类(日志/追踪数据/终端快照/文件历史/剪贴板图片/审计日志/连接器市场缓存)
- 列出待删清单:从 JSON 快照取该类别的路径、大小、文件数,以表格展示。
- 特别提醒:
- 日志类:说明.log文件可安全删除,但.mmap3/.json文件需评估(scan.py 报告中有文件类型细分)。如果用户只删.log,明确告知只删.log文件。
- 删除后排障能力可能略降,但不影响功能。 - 确认:向用户确认一次(明确列出路径和释放空间)。
- 执行删除:使用 PowerShell 工具调用回收站脚本:
powershell
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\clean.ps1" -Paths "路径1;路径2"
多个路径用英文分号连接。脚本对每个路径输出 OK_DIR/OK_FILE/OK_EMPTY/REFUSED/MISSING/FAIL。
注意:不要从 bash/Git Bash 转调 powershell.exe,会被安全策略拦截;不要在 PowerShell 工具中直接 & 调用 .ps1,必须加 -ExecutionPolicy Bypass。
5. 输出删除结果:表格列出每个路径的结果,并提示:已移至系统回收站,如需彻底删除请手动清空回收站。
2b. 谨慎删类 — 对话记录
- 强制备份(不可跳过):调用流程三(备份),将待删对话备份成 md 摘要并打包 zip。
- 备份校验:确认 zip 生成成功且 zip 内每个 md 文件非空。备份失败则中止删除,不继续。
- 列出待删清单:从 JSON 快照取对话文件路径、项目、大小、时间,以表格展示。排除 7 天内有活动的活跃会话。
- 确认:向用户确认(明确列出将删的对话数量、释放空间、备份 zip 路径)。
- 执行删除:同 2a 步骤 4,调用 clean.ps1。
- 输出删除结果:同 2a 步骤 5,并附上备份 zip 路径供用户下载。
2c. 谨慎删类 — 截图附件(blobs)
- 引用分析:扫描对话 jsonl 中的图片引用,区分"被对话引用的图片"和"孤儿图片"。
- 只允许删除孤儿图片(无对话引用的)。
- 列出孤儿图片清单,确认后删除。
2d. 谨慎删类 — 会话缓存(app)
- 活跃会话保护:读取
~/.workbuddy/app/sessions.json,检查每个会话的resumedAt字段。7 天内有resumedAt的会话标记为活跃,不删除。 - 列出非活跃会话的缓存目录清单,确认后删除。
2e. 清理 skills
不要用本技能的 clean.ps1 直接删除 skills 目录。 而是引导用户使用【Skill 使用情况评估和删除】技能:
- 告知用户:skills 目录占用约 XXX 空间,推荐使用【Skill 使用情况评估和删除】技能来清理长期未用的 skill。
- 如果用户尚未安装该技能:
- 方案一:引导用户在技能市场中搜索【Skill 使用情况评估和删除】并自行安装
- 方案二:经用户授权后,调用 skillhub 接口帮用户安装 - 安装完成后,引导用户触发该技能进行 skill 清理。
流程三:删除对话前强制备份(子流程)
触发条件:用户选择删除对话记录(按类别或按时间),在执行删除前必须先完成此流程。
- 收集对话文件:
- 按类别删:从 JSON 快照取所有对话 jsonl 文件路径
- 按时间删:调用scan.py --mode conversations获取对话列表,筛选 N 天前的对话 - 询问备份位置:问用户备份 zip 存到哪个路径(如不指定,默认存到当前工作目录下
workbuddy-backup-YYYYMMDD.zip)。 - 执行备份:
bash
"<managed-python>" "<SKILL_DIR>\scripts\backup.py" --input "文件1;文件2;目录1" --output "<zip路径>"
脚本会:
- 解析每个 jsonl,过滤系统注入噪音(system-reminder 等)
- 按项目硬归类(同 projects/ 子目录的对话强制归入该项目 md)
- 每个 md 内按对话起止时间由近到远排列
- 每段对话用总分结构:先摘要,再展开详情
- 打包所有 md 到 zip
4. 校验备份:
- zip 文件生成成功(大小 > 0)
- zip 内每个 md 文件非空(脚本内部已校验,如果失败会 exit(1))
- 校验通过 → 继续删除流程
- 校验失败 → 中止删除,告知用户备份失败,不执行任何删除
流程四:按时间删除对话
触发条件:用户指定删除多少天前的对话,如"删60天前的对话""删除3个月前的"。
- 获取对话列表:
bash
"<managed-python>" "<SKILL_DIR>\scripts\scan.py" --mode conversations
输出 JSON 格式的对话列表,每个对话包含 file_path、project_slug、age_days、last_time 等。
2. 筛选:按用户指定的天数筛选 age_days > N 的对话。
3. 如果没有符合条件的对话,告知用户"没有 N 天前的对话,无需删除"。
4. 强制备份(流程三):将筛选出的对话备份成 md zip。
5. 列出待删清单:表格展示将删的对话(项目、时间、大小),以及备份 zip 路径。
6. 确认:用户确认后执行删除(clean.ps1)。
7. 输出结果:删除结果 + 备份 zip 路径 + 回收站提示。
三个硬安全机制
- 强制备份不可跳过:用户选择删对话 → 备份模块必须先跑完并生成 zip → 校验 zip 非空 → 才允许进入删除步骤。备份失败则中止。
- 当前活跃会话保护:删除会话缓存时,读取
sessions.json的resumedAt,排除 7 天内有活动的会话目录。 - 白名单硬保护:
binaries、vendor、plugins、storage-cleaner自身写死在 clean.ps1 的保护列表中,即使用户选了也拒绝(脚本返回REFUSED)。
数据说明
- 扫描范围:
~/.workbuddy/下各子目录。不可删内容(binaries/vendor/plugins)不进统计表,只在总结文字中提及总大小。 - 时间分布口径:对话 jsonl 使用文件内部
timestamp字段(毫秒时间戳)计算起止时间,比文件 mtime 更准确(避免续聊旧对话刷新 mtime 的偏差)。 - 日志安全性:
.log文件是诊断日志,删除后不影响功能但排障能力下降;.mmap3文件可能是运行态内存映射,删除可能影响当前会话,需谨慎评估。scan.py 报告中对 logs 目录有文件类型细分标注。 - 删除方式:所有删除通过 PowerShell 调用
Microsoft.VisualBasic.FileIO.FileSystemAPI,移入 Windows 回收站。用户可从回收站恢复,彻底删除需手动清空回收站。 - 备份格式:md 文件采用总分结构——文件开头有概述段落,每段对话先给摘要再展开详情。同项目对话强制归入同一个 md 文件。