会话名称同步
双向同步Claude Code(CLI + VSCode)和cc-connect(飞书)之间的会话名称。
三个命名系统 → 两个存储位置:
Claude Code CLI /rename 和VSCode → 同时读写JSONL自定义标题项
cc-connect /name(飞书)→ 写入自己的JSON文件(sessions[sN].name + session_names[UUID])
保持这两个存储位置一致 = 三个命名系统统一。
VSCode ↔ cc-connect 对应关系:
VSCode中的命名会话对应cc-connect的飞书聊天中的标签页:
模式
在JSONL自定义标题项和cc-connect JSON文件中同时设置会话名称。
触发示例: "给会话命名xxx", "/session-name-sync set xxx", "把这个会话叫xxx"
步骤:
确定当前会话UUID从$CLAUDE_CODE_SESSION_ID环境变量
追加自定义标题项到会话JSONL文件(Claude Code侧)
更新sessions[sN].name和session_names[UUID]在cc-connect JSON(cc-connect侧)
报告成功,确认两个位置
- sync — 读取两个侧,报告不匹配,询问用户,然后修复
比较两个存储位置的名称。 如果它们不同,询问用户哪一个保持,然后传播。
触发示例: "同步会话名", "/session-name-sync sync", "sync session names"
步骤:
确定当前会话UUID
读取Claude Code标题:grep自定义标题(最高优先级),然后ai标题,然后第一个用户消息
读取cc-connect名称:找到session_key通过agent_session_id,读取sessions[key].name
比较和报告;如果不匹配,询问用户使用哪个名称(或输入一个新名称)
将选定的名称应用于两个存储位置
显示两个命名系统中所有会话的比较表。
触发示例: "列出会话名", "/session-name-sync list", "session name list"
步骤:
扫描Claude Code项目目录中的所有JSONL文件,提取每个自定义标题/ai标题
扫描cc-connect会话JSON,提取每个会话的名称
通过agent_session_id = sessionId连接,构建比较表
显示仅在一个系统中的会话(本地仅vs cc-connect仅)
- bind — 将一个侧的当前会话名称同步到另一个侧
对于当前活动会话,复制一个侧的现有名称到另一个侧的空/缺失侧。
触发示例: "绑定会话名", "/session-name-sync bind"
步骤:
确定当前会话UUID
读取两个侧的名称
如果一个侧有名称而另一个侧为空,复制名称到空侧
如果两个侧都有名称(且匹配),报告"已经绑定"
如果两个侧都有名称但不同,询问使用哪个(与sync模式相同)
- register — 将本地VSCode会话注册到cc-connect,以便在飞书中显示
将本地Claude Code会话(具有名称的会话)添加到cc-connect JSON文件中,以便在飞书聊天中显示。
触发示例: "注册会话", "register sessions", "/session-name-sync register", "注册本地会话"
优化流程 — 避免重启守护进程,除非必要:
先扫描,然后决定:
运行一个Python脚本,扫描Claude Code会话并读取cc-connect JSON,然后输出需要做什么的摘要:
新会话注册(计数 + 列表)
守护进程清除名称恢复(计数 + 列表)
名称不匹配(计数 + 列表)
历史计数漂移(计数 + 列表)
提前退出:
如果没有新会话,没有清除名称,没有名称不匹配 → 跳过守护进程停止/重启。
历史计数漂移是纯粹的美观问题(/list显示数字),不值得破坏飞书连接。
报告漂移并让用户决定是否需要完全重启来修复它们。
只有当需要操作时:
停止守护进程 → 在一个原子写入中进行所有更改(注册 + 恢复 + 不匹配 + 历史 + past_id_tracking=False) → 重启守护进程 → 警告用户5分钟恢复延迟。
只注册具有名称的会话。
未命名的会话被跳过 — 在/list中显示未命名条目没有价值。
重要注意事项:
注册的会话出现在/list中,但不能从飞书接收消息(没有运行的进程)。
如果cc-connect守护进程重启,它可能会尝试会话/加载这些UUID(内部恢复),这可能会产生新的进程以恢复会话状态 — 但这种行为不是保证的。
永远不要重新注册:
跳过在cc-connect JSON中已经存在agent_session_id的会话。
历史计数:
cc-connect /list显示来自历史数组长度的消息计数,而不是来自JSONL文件。
注册的会话需要用最少的条目(角色 + "."内容)填充历史,以匹配JSONL消息计数,以便/list显示正确的数字。
实际的对话内容仍然通过--resume UUID从JSONL提供。
这些"."条目不会出现在模型上下文中 — Claude Code只从JSONL加载type=human/assistant/user消息。
单次扫描 + 比较脚本:
import json, os, glob
from datetime import datetime, timezone
cc_project_dir = os.path.expanduser('~/.claude/projects/-code-owner-x')