会话查找与重命名
用户记不住任务叫什么、又需要找回某次对话时的专用技能。核心原则:先在正文里搜,再让用户确认,最后才改名。
数据在哪
| 内容 | 路径 |
|---|---|
| 会话元信息(名字、时间、目录、状态) | ~/.workbuddy/workbuddy.db → sessions 表 |
| 对话正文(逐行 JSON 事件) | ~/.workbuddy/projects/<cwd-slug>/<sessionId>.jsonl |
| 改名历史(可回滚) | ~/.workbuddy/tools/rename-log.jsonl |
sessions 表里给用户看的是 COALESCE(custom_title, title)。改名要同时写 title 和 custom_title,
以兼容不同客户端版本的读取方式。
命令
脚本在本技能目录下:scripts/wb_sessions.py。用 python3 调用;Windows 上没有 python3 时用 python。
S="<本技能目录>/scripts/wb_sessions.py"
python3 "$S" list # 全部会话:名字 / 时间 / 大小 / ID
python3 "$S" list --all # 含已删除的(正文文件通常还在盘上)
python3 "$S" search "关键词" # 搜名字 + 全部正文,按命中数排序
python3 "$S" show <sessionId> --turns 8 # 看开头几轮,用来确认是不是要找的那个
python3 "$S" rename <sessionId> "新名字" # 改名(写前自动备份数据库)
python3 "$S" undo [sessionId] # 撤销改名,取最近一条记录
python3 "$S" index [--out 路径] # 生成 ~/.workbuddy/session-index.md
工作流程
- 提取关键词。从用户的描述里挑实体词:产品名、项目名、人脸名、文件名、技术名词。
不要把整句描述丢进去当关键词。 - 搜。用 1–3 组关键词分别跑
search。搜不到就换同义词、缩写、更短的词。
还不行就用list把全部会话列出来,靠时间和目录肉眼筛。 - 出示候选。把命中的会话名、时间、以及各 1–2 条正文摘录发出来,让用户选。
不要替用户猜。 宁可多问一句,也不要改错一个。 - 确认后再改名。只改用户指认的那一个会话。
- 起名。具体、可搜索,20 字以内,必须含关键实体。
- 好:Hub MCP 接入方案、个人 Agent 竞品分析(Cursor/Manus)
- 差:关于 MCP 的讨论、聊天记录 3 - 告知刷新方式。侧边栏可能仍显示旧名字,切换会话或重启客户端后才会更新。
硬规则
- 一次只改一个会话,且必须是用户明确指认的那个。批量改名要逐个说明并得到同意。
- 改名只写
title和custom_title两列,绝不碰updated_at、status、last_active_at等运行时字段,
否则会把会话顶到列表最前面或改变排序。 - 写库前脚本会自动
VACUUM INTO备份到~/.workbuddy/tools/backup/;备份失败也继续,但要在回复里说明。 - 数据库是客户端正在使用的 SQLite,用
busy_timeout等待锁,不要删 WAL 文件,不要 VACUUM 主库。 - 已删除的会话(
deleted_at非空)默认不列出。用户明确说「已经删掉的」时才加--all。
已知边界
- 云端会话(
transport = 'cloud',例如手机端发起)本地没有 jsonl,只能列出来、能改名,但搜不到正文。 - 关键词搜索是字面匹配,不做语义理解。用户描述模糊时(「那个聊了很久的」),
先list看时间和体积,再show逐个确认。 sessions表结构随客户端版本变化。脚本改名时会检查custom_title是否存在,
不存在会明确报错而不是静默失败。- 大体积会话(几 MB)搜索会慢一两秒,属正常。
失败处理
| 情况 | 做法 |
|---|---|
找不到 workbuddy.db |
说明尚未使用过客户端,或 WORKBUDDY_HOME 指向不对 |
| 改名后侧边栏没变 | 提示切换会话 / 重启客户端;仍无效则用 undo 还原并如实告知 |
| 改错了 | 立刻 undo <sessionId>,并核对还原后的名字 |
| 数据库被锁 | 提示用户暂时不要在客户端里操作,稍后重试一次 |
不做的事
- 不删除任何会话。
- 不修改对话正文(jsonl)。
- 不把会话内容上传到任何远端服务;全部操作只在本机。