修复 WorkBuddy 的任务
适用场景
当 WorkBuddy 左侧任务列表中的对话打不开、提示"工作目录已被重命名或删除"、或需要重命名/合并/修复工作目录时使用。
核心架构(必须理解)
WorkBuddy 的工作目录路径存储在四处,四者必须一致:
| # | 位置 | 路径 | 说明 |
|---|---|---|---|
| 1 | 文件夹本身 | /Users/{用户名}/WorkBuddy/{名称}/ |
实际的工作目录,用户在访达中看到的 |
| 2 | 数据库 sessions.cwd | ~/.workbuddy/workbuddy.db → sessions 表 cwd 字段 |
真正的数据源,运行时以此为准 |
| 3 | projects 目录 | ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称}/ |
对话日志(.jsonl)存放处,目录名 = cwd 路径把 / 替换为 - |
| 4 | sessions.json 缓存 | ~/.workbuddy/app/sessions.json → sessions[].workDir |
启动时读取的缓存,重启时如果不同步会导致对话历史丢失 |
关键认知:
- ~/.workbuddy/app/sessions.json 是启动缓存,WorkBuddy 重启时先读它。如果 workDir 指向旧路径,对话历史会找不到(✅ 已验证:重命名目录后只更新数据库不更新 sessions.json,重启后对话内容消失)
- 重命名工作目录时必须同时更新四处:文件夹 + 数据库 cwd + projects 目录 + sessions.json workDir
- 对话日志(.jsonl)存储在 projects 目录下,与文件系统的工作目录路径独立——即使工作目录被删除,对话日志仍然存在
- 数据库中 deleted_at 字段不为空表示对话已被用户删除,但日志数据仍在磁盘上
- 重启后 WorkBuddy 可能基于 sessions.json 的旧 workDir 重建旧 projects 目录并写入碎片数据,需清理
诊断流程
第 1 步:查询所有对话状态
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT substr(id,1,8) as id, cwd, custom_title,
CASE WHEN deleted_at IS NOT NULL THEN '已删除' ELSE '活跃' END as status,
datetime(created_at/1000, 'unixepoch', 'localtime') as created
FROM sessions ORDER BY created_at DESC;"
第 2 步:逐个检查路径一致性
对每个活跃对话,检查三处是否一致:
# 检查工作目录是否存在
ls -d "{cwd路径}" 2>&1
# 检查 projects 目录是否存在
ls -d ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称}/ 2>&1
# 检查对话日志是否存在
ls ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称}/*.jsonl 2>&1
第 3 步:根据症状定位问题
参见下方"问题清单与修复方案"。
问题清单与修复方案
问题 1:文件夹被重命名(✅ 已验证)
症状:对话提示"工作目录已被重命名或删除"
原因:用户在访达中直接重命名了文件夹,但数据库中的 cwd 仍指向旧路径
修复:更新数据库 cwd + 重命名 projects 目录
# 0. 备份数据库
cp ~/.workbuddy/workbuddy.db ~/.workbuddy/workbuddy.db.bak
# 1. 查询对话 ID 和旧路径
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT id, cwd FROM sessions WHERE deleted_at IS NULL;"
# 2. 更新数据库 cwd(用实际的新文件夹名)
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET cwd = '/Users/{用户名}/WorkBuddy/{新名}' WHERE id = '{完整ID}';"
# 3. 重命名 projects 目录
mv ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{旧名} \
~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名}
# 4. 验证
sqlite3 ~/.workbuddy/workbuddy.db \
"SELECT substr(id,1,8), cwd FROM sessions WHERE id = '{完整ID}';"
问题 2:文件夹被删除(✅ 已验证)
症状:对话提示"工作目录已被重命名或删除",且用户确认文件夹已删
两种情况:
情况 A:对话也被删除了(deleted_at 不为空)
- 对话日志仍在 projects 目录中,空的工作目录可安全删除
- 无需修复,对话已从列表移除
情况 B:对话仍活跃(deleted_at 为空),但工作目录被误删
- 重建空目录即可恢复访问:
mkdir -p "{cwd路径}"
- 对话历史不会丢失(存在 projects 目录中)
问题 3:需要重命名工作目录(✅ 已验证)
修复:文件夹改名 + 更新数据库 + 重命名 projects 目录 + 更新 sessions.json
# 0. 备份
cp ~/.workbuddy/workbuddy.db ~/.workbuddy/workbuddy.db.bak
cp ~/.workbuddy/app/sessions.json ~/.workbuddy/app/sessions.json.bak
# 1. 重命名文件夹
mv "/Users/{用户名}/WorkBuddy/{旧名}" "/Users/{用户名}/WorkBuddy/{新名}"
# 2. 更新数据库
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET cwd = '/Users/{用户名}/WorkBuddy/{新名}' WHERE id = '{完整ID}';"
# 3. 重命名 projects 目录
mv ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{旧名} \
~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名}
# 4. 更新 sessions.json 缓存(关键!不更新重启后对话历史会消失)
# 用 Edit 工具把 sessions.json 中对应 conversationId 的 workDir 改为新路径
⚠️ 踩坑记录:只更新数据库不更新 sessions.json,WorkBuddy 重启后会读取 sessions.json 的旧 workDir,导致:
- 对话历史在界面中消失(数据仍在 projects 目录中)
- WorkBuddy 可能基于旧 workDir 重建旧 projects 目录并写入碎片数据
- 需要更新 sessions.json + 清理旧 projects 目录
**注意**:如果改的是当前正在使用的对话目录,改完后当前会话会异常,必须重启 WorkBuddy。
### 问题 4:合并多个工作空间(✅ 已验证)
**场景**:把两个空间(如 cc等工具 + openclaw)合并成一个(工具问答)
**限制**:两个独立对话无法真正合并为一个对话,只能让它们共享同一工作目录
**步骤**:
```bash
# 0. 备份
cp ~/.workbuddy/workbuddy.db ~/.workbuddy/workbuddy.db.bak
# 1. 创建新文件夹,合并内容
mkdir -p "/Users/{用户名}/WorkBuddy/{新名}/.workbuddy/memory"
cp -R "/Users/{用户名}/WorkBuddy/{旧名1}/.workbuddy/memory/"* "/Users/{用户名}/WorkBuddy/{新名}/.workbuddy/memory/"
cp -R "/Users/{用户名}/WorkBuddy/{旧名2}/.workbuddy/memory/"* "/Users/{用户名}/WorkBuddy/{新名}/.workbuddy/memory/"
# 2. 更新数据库:两个对话都指向新目录
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET cwd = '/Users/{用户名}/WorkBuddy/{新名}' WHERE id = '{ID1}';"
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET cwd = '/Users/{用户名}/WorkBuddy/{新名}' WHERE id = '{ID2}';"
# 3. 合并 projects 目录
mkdir -p ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名}
cp -R ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{旧名1}/* \
~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名}/
cp -R ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{旧名2}/* \
~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名}/
# 4. 旧文件夹移至废纸篓(不要用 rm)
osascript -e 'tell application "Finder" to delete POSIX file "/Users/{用户名}/WorkBuddy/{旧名1}"'
osascript -e 'tell application "Finder" to delete POSIX file "/Users/{用户名}/WorkBuddy/{旧名2}"'
# 5. 注册新空间
sqlite3 ~/.workbuddy/workbuddy.db \
"INSERT OR REPLACE INTO workspaces (path, last_opened_at) VALUES ('/Users/{用户名}/WorkBuddy/{新名}', strftime('%s','now') * 1000);"
问题 5:恢复已删除的对话(⚠️ 未验证)
场景:对话被删除(deleted_at 不为空),但用户想恢复
理论修复:清除 deleted_at 字段
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET deleted_at = NULL WHERE id = '{完整ID}';"
⚠️ 未验证警告:此操作未在用户电脑上验证过。执行前必须告知用户:
- 这是理论上的恢复方法,未经实际验证
- 可能需要同时检查 workDir 路径是否存在
- 可能需要重启 WorkBuddy 才能生效
- 建议先备份数据库
问题 6:对话日志文件(.jsonl)损坏或丢失(⚠️ 未验证)
症状:对话在列表中显示,但点击后内容为空或报错
可能原因:
- .jsonl 文件被意外删除
- 文件写入时被中断导致格式损坏
- 磁盘错误导致文件损坏
⚠️ 未验证警告:以下修复方案未经实际验证,执行前需让用户确认:
- 检查 projects 目录下是否有 .jsonl 文件
- 如果文件存在但损坏,尝试用 head/tail 查看损坏位置
- 如果文件丢失,可能需要从备份恢复
- 没有简单的修复方法,可能需要联系 WorkBuddy 支持
问题 7:workbuddy.db 数据库损坏(⚠️ 未验证)
症状:WorkBuddy 无法启动,或所有对话都打不开
检查:
sqlite3 ~/.workbuddy/workbuddy.db "PRAGMA integrity_check;"
⚠️ 未验证警告:以下方案未经验证:
- 如果有备份,恢复备份:cp ~/.workbuddy/workbuddy.db.bak ~/.workbuddy/workbuddy.db
- 如果没有备份,尝试修复:sqlite3 ~/.workbuddy/workbuddy.db ".recover" > recovered.sql
- 重建数据库:sqlite3 ~/.workbuddy/workbuddy.db.new < recovered.sql
- 可能丢失部分会话元数据
问题 8:权限问题导致无法访问(⚠️ 未验证)
症状:WorkBuddy 提示权限错误
检查:
ls -la ~/.workbuddy/workbuddy.db
ls -la "/Users/{用户名}/WorkBuddy/{名称}/"
⚠️ 未验证警告:以下方案未经验证:
# 修复所有者
sudo chown -R {用户名}:staff ~/.workbuddy/
sudo chown -R {用户名}:staff "/Users/{用户名}/WorkBuddy/"
问题 9:projects 目录缺失但 cwd 正确(⚠️ 未验证)
症状:工作目录存在,数据库路径正确,但对话内容为空
检查:
ls ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称}/ 2>&1
⚠️ 未验证警告:以下方案未经验证:
- 如果目录不存在,尝试创建空目录:mkdir -p ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称}/
- 对话历史可能已丢失,新对话可以从当前工作目录开始
- 不确定 WorkBuddy 是否会自动重建
问题 10:移动工作目录到其他位置(✅ 已验证原理)
场景:用户想把工作目录从 WorkBuddy/ 移到别处(如桌面)
风险:会导致对话打不开
修复:移动后需同步更新数据库 cwd + 重命名 projects 目录
# 移动文件夹
mv "/Users/{用户名}/WorkBuddy/{名称}" "/Users/{用户名}/新位置/{名称}"
# 更新数据库
sqlite3 ~/.workbuddy/workbuddy.db \
"UPDATE sessions SET cwd = '/Users/{用户名}/新位置/{名称}' WHERE id = '{完整ID}';"
# 重命名 projects 目录(projectKey = cwd 路径所有 / 替换为 -)
mv ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{名称} \
~/.workbuddy/projects/Users-{用户名}-新位置-{名称}
建议:不要随意移动工作目录,在目标位置新建空间更安全。
修复后的蒸馏流程
每次完成一次修复后,按以下流程更新本 Skill:
- 判断是否为新问题:如果遇到的问题已在"问题清单"中,只需更新已有方案
- 标记验证状态:
- ✅ 已验证:在用户电脑上实际操作过且成功的方案
- ⚠️ 未验证:理论上可行但未经实际验证的方案 - 更新 SKILL.md:在对应的问题条目下补充:
- 实际遇到的症状
- 验证过的修复步骤
- 踩过的坑和注意事项 - 如果问题全新:在"问题清单"中新增条目,按格式填写
操作原则
- 始终先备份数据库:
cp ~/.workbuddy/workbuddy.db ~/.workbuddy/workbuddy.db.bak - ⚠️ 未验证的操作必须让用户确认:遇到标记为"⚠️ 未验证"的方案时,先告知用户风险,获得明确同意后才执行
- 删除用废纸篓不用 rm:
osascript -e 'tell application "Finder" to delete POSIX file "..."' - 路径含中文/空格必须加双引号
- 一次只改一个对话:批量操作容易出错
- 改完后重启 WorkBuddy:退出应用再重新打开才能生效
- 修复完成后蒸馏:把这次修复的经验更新到本 Skill 中
回滚
如果修复出错:
# 恢复数据库
cp ~/.workbuddy/workbuddy.db.bak ~/.workbuddy/workbuddy.db
# 改回文件夹名
mv "/Users/{用户名}/WorkBuddy/{新名}" "/Users/{用户名}/WorkBuddy/{旧名}"
# 改回 projects 目录
mv ~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{新名} \
~/.workbuddy/projects/Users-{用户名}-WorkBuddy-{旧名}
一键脚本
参见 scripts/rename-workspace.sh——用于重命名工作目录的一键脚本。
```