关于 session-replay
session-replay 可将 Claude Code 会话 JSONL 文件转换为终端输出风格的动画 GIF,适合制作开发演示、PR 证据和教程片段,并支持筛选轮次与显示内容。
主要功能
- 01将会话 JSONL 解析为轮次
- 02筛选轮次和显示内容层
- 03从对话生成 VHS 磁带
- 04将磁带渲染为动画 GIF
适用场景
- 01制作开发工作流演示
- 02为 PR 附上回放证据
- 03在 Slack 或 GitHub 分享会话片段
- 04在教程中嵌入回放
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ athola/ claude-night-market --skill session-replay安装后在 Claude Code 中输入/session-replay确认已加载。
详细介绍
Session Replay
将 Claude Code 会话 JSONL 文件转换为动画 GIF, 以终端输出逐字显示对话。
此技能按三个步骤执行:将会话文件解析为轮次, 根据这些轮次生成 VHS 磁带,然后交由 scry 渲染 GIF。
使用场景
- 创建开发工作流演示
- 为拉取请求添加可视化证据
- 在 Slack 或 GitHub 上分享会话亮点
- 在教程中嵌入会话回放
不适用场景
- 根据会话撰写博客文章(使用
scribe:session-to-post) - 生成 API 文档(使用
scribe:doc-generator) - 录制实时终端命令(直接使用
scry:vhs-recording)
集成点
| 需求 | 技能 | 提供的功能 |
|---|---|---|
| GIF 渲染 | scry:vhs-recording | 将 VHS 磁带转换为动画 GIF |
| 嵌入教程 | scribe:tech-tutorial | 在教程 Markdown 中嵌入 GIF |
| 准备 PR | sanctum:prepare-pr | 将回放作为 PR 证据附上 |
工作流
步骤 0:选择会话(未提供路径时)
用户在不带路径参数的情况下调用 /session-replay 时,
使用 scribe.session_parser.list_sessions() 从 ~/.claude/projects/
中查找最近的会话文件。
该函数会返回按修改时间排序的 SessionInfo 对象列表(最新的在前),每个对象包含:
path:.jsonl 文件的完整路径modified:mtime 时间戳first_user_message:第一条用户消息的预览turn_count:会话中的用户轮次数project_name:父目录名称
以编号菜单的形式向用户展示列表:
Recent sessions:
1. [my-project] "implement auth module" (8 turns, 2h ago)
2. [api-server] "fix rate limiting bug" (3 turns, 5h ago)
3. [docs-site] "update installation guide" (12 turns, 1d ago)
请用户选择一个编号。后续步骤使用所选会话的
path。
如果 list_sessions 返回空列表,告知用户未找到会话,
并建议直接提供路径。
步骤 1:解析会话
使用 scribe.session_parser.parse_session() 读取 JSONL
文件。解析器会:
- 提取用户和助手轮次
- 跳过 sidechain(子 Agent)记录
- 将工具调用整理为易读的摘要
- 按配置的列宽换行文本
- 按配置的行数截断过长的回复
根据用户选项应用筛选条件:
--turns选择指定的轮次范围(例如1-5)--show控制显示哪些层:user、assistant、tools、thinking(默认不包含 thinking)
步骤 2:生成 VHS 磁带
使用 scribe.tape_generator.generate_tape() 将解析后的
轮次转换为 VHS 磁带文件。生成器会:
- 创建 Output 指令和 Set 命令
- 以 30ms/字符的速度输入用户消息,并添加
$前缀 - 以 15ms/字符的速度输入助手回复
- 以 100ms 的速度输入工具摘要,并缩进两个空格
- 在轮次之间添加 1.5s 的暂停
- 将最后一帧保持 3s
- 按
--speed倍速缩放所有时间 - 超出
--max-duration时截断内容
将磁带写入临时文件:
{tempdir}/session-replay-{timestamp}.tape
步骤 3:渲染 GIF
使用磁带文件路径调用 Skill(scry:vhs-recording)。
Scry 会验证磁带、运行 VHS,并在 Output 指令指定的
路径生成 GIF。
渲染成功后,删除临时磁带文件。
错误处理
| 错误 | 操作 |
|---|---|
| 未安装 VHS | 提示:通过 go install github.com/charmbracelet/vhs@latest 安装 |
| 磁带语法错误 | 报告 VHS 错误输出。可能是字符串转义错误。 |
| GIF 生成失败 | 报告 VHS 错误。建议使用 --turns 1-5 缩小范围。 |
| 未找到 Scry 技能 | 提示:渲染 GIF 需要 scry 插件。 |
示例
# Pick from recent sessions interactively
/session-replay
# Replay a specific file directly
/session-replay ~/.claude/projects/my-project/abc123.jsonl
# First 5 turns only, faster playback
/session-replay --turns 1-5 --speed 1.5
# Show only the conversation, no tool calls
/session-replay --show user,assistant --output demo.gif
输出(交互式选择器):
Recent sessions:
1. [my-project] "implement auth module" (8 turns, 2h ago)
2. [api-server] "fix rate limiting bug" (3 turns, 5h ago)
3. [docs-site] "update installation guide" (12 turns, 1d ago)
Pick a session [1-3]: 1
Parsed 42 turns from session (12 user, 15 assistant, 15 tools)
Generated tape: /tmp/session-replay-1711234567.tape
Rendering GIF via scry...
Done: session-replay.gif (18s, 960x540)
退出标准
- 在尝试渲染之前,将 VHS 磁带文件写入
{tempdir}/session-replay-{timestamp}.tape - 在磁带文件的
Output指令指定的路径生成 GIF,并报告其大小(时长、尺寸) - GIF 成功渲染后删除临时磁带文件
- 如果未安装 VHS,则报告错误并提供安装命令
go install github.com/charmbracelet/vhs@latest,而不是 静默失败 - 如果未提供 JSONL 路径,且
list_sessions()返回空结果, 则告知用户未找到会话,并提示直接提供路径