mcpField
A
asciinema-cast-format

asciinema-cast-format

github.com/terrylica开发2132 次安装今天更新
代码仓库

关于 asciinema-cast-format

面向开发者的 asciinema .cast 录制文件格式参考技能,适用于检查录制内容或构建相关工具。内容涵盖 NDJSON 结构、事件类型、解析示例及大文件处理。

主要功能

  1. 01头部与事件结构
  2. 02事件代码与时间戳
  3. 03jq 解析示例
  4. 04大文件处理指引

适用场景

  1. 01检查 .cast 元数据和事件
  2. 02构建 .cast 读写工具
  3. 03排查录制格式错误
  4. 04提取输出、标记或定时事件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/terrylica/cc-skills --skill asciinema-cast-format

安装后在 Claude Code 中输入/asciinema-cast-format确认已加载。

附带文件references/evolution-log.md

详细介绍

asciinema-cast-format

asciinema v3 .cast 文件格式参考文档(asciicast v2 规范)。

平台:所有平台(仅文档)

自我演进技能:此技能会随着使用不断改进。如果说明有误、参数发生偏差,或需要使用变通方法,请立即修复此文件,不要拖延。仅针对真实且可复现的问题进行更新。

何时使用此技能

在以下情况使用此技能:

  • 解析或检查 .cast 文件结构
  • 了解 NDJSON 标头和事件格式
  • 构建读取或写入 .cast 文件的工具
  • 调试录制问题或格式错误
  • 学习 asciicast v2 规范

格式概述

Asciinema v3 使用 NDJSON(换行符分隔的 JSON)格式:

  • 第 1 行:包含录制元数据的标头对象
  • 第 2 行及之后:包含时间戳、类型和数据的事件数组

标头规范

第一行是一个包含以下字段的 JSON 对象:

字段类型必需说明
versionint是格式版本(v3 录制始终为 2)
widthint是终端宽度(列数)
heightint是终端高度(行数)
timestampint否录制开始时间的 Unix 时间戳
durationfloat否总时长(秒)
titlestring否录制标题
envobject否环境变量(SHELL、TERM)
themeobject否终端配色主题
标头示例
{
  "version": 2,
  "width": 120,
  "height": 40,
  "timestamp": 1703462400,
  "duration": 3600.5,
  "title": "Claude Code Session",
  "env": { "SHELL": "/bin/zsh", "TERM": "xterm-256color" }
}

事件代码

标头之后的每个事件都是一个包含 3 个元素的数组:

[timestamp, event_type, data]
代码名称说明数据格式
o输出终端输出(stdout)字符串
i输入终端输入(stdin)字符串
m标记用于导航的命名标记字符串(标记名称)
r调整大小终端调整大小事件"WIDTHxHEIGHT"
x退出自定义数据扩展不定
事件示例
[0.5, "o", "$ ls -la\r\n"]
[1.2, "o", "total 48\r\n"]
[1.3, "o", "drwxr-xr-x  12 user  staff  384 Dec 24 10:00 .\r\n"]
[5.0, "m", "file-listing-complete"]
[10.5, "r", "80x24"]

时间戳行为

  • 时间戳相对于录制开始时间(第一个事件为 0.0)
  • 以秒为单位,精度为毫秒
  • 用于播放计时和导航
计算绝对时间
/usr/bin/env bash << 'CALC_TIME_EOF'
HEADER_TIMESTAMP=$(head -1 recording.cast | jq -r '.timestamp')
EVENT_OFFSET=1234.5  # From event array

ABSOLUTE=$(echo "$HEADER_TIMESTAMP + $EVENT_OFFSET" | bc)
date -r "$ABSOLUTE"  # macOS
# date -d "@$ABSOLUTE"  # Linux
CALC_TIME_EOF

解析示例

使用 jq 提取标头
/usr/bin/env bash << 'HEADER_EOF'
head -1 recording.cast | jq '.'
HEADER_EOF
获取录制时长
/usr/bin/env bash << 'DURATION_EOF'
head -1 recording.cast | jq -r '.duration // "unknown"'
DURATION_EOF
按类型统计事件数量
/usr/bin/env bash << 'COUNT_EOF'
tail -n +2 recording.cast | jq -r '.[1]' | sort | uniq -c
COUNT_EOF
提取所有输出事件
/usr/bin/env bash << 'OUTPUT_EOF'
tail -n +2 recording.cast | jq -r 'select(.[1] == "o") | .[2]'
OUTPUT_EOF
查找标记
/usr/bin/env bash << 'MARKERS_EOF'
tail -n +2 recording.cast | jq -r 'select(.[1] == "m") | "\(.[0])s: \(.[2])"'
MARKERS_EOF
获取指定时间的事件
/usr/bin/env bash << 'TIME_EOF'
TARGET_TIME=60  # seconds
tail -n +2 recording.cast | jq -r "select(.[0] >= $TARGET_TIME and .[0] < $((TARGET_TIME + 1))) | .[2]"
TIME_EOF

大文件注意事项

对于大于 100MB 的录制文件:

文件大小行数处理方法
<100MB<1M使用 jq 流式处理即可
100-500MB1-5M使用 --stream 标志,考虑使用 ripgrep
500MB+5M+先使用 asciinema 转换为 .txt
高效内存流式处理
/usr/bin/env bash << 'STREAM_EOF'
# Stream process large files
jq --stream -n 'fromstream(1|truncate_stream(inputs))' recording.cast | head -1000
STREAM_EOF
使用 asciinema convert

对于非常大的文件,请先转换为纯文本:

asciinema convert -f txt recording.cast recording.txt

这会去除 ANSI 代码并生成干净的文本(通常可达到 950:1 的压缩比)。


TodoWrite 任务模板

1. [Reference] Identify .cast file to analyze
2. [Header] Extract and display header metadata
3. [Events] Count events by type (o, i, m, r)
4. [Analysis] Extract relevant event data based on user need
5. [Navigation] Find markers or specific timestamps if needed

更改后检查清单

修改此技能后:

  1. 事件代码表符合 asciinema v2 规范
  2. 解析示例使用 heredoc 包装,以兼容 bash
  3. 大文件处理建议反映实际性能特征
  4. 已使用示例 .cast 文件测试所有 jq 命令

参考文档


故障排查

问题原因解决方案
jq 解析错误.cast 文件中的 NDJSON 无效使用 jq -c . 检查每一行是否为有效 JSON
标头缺少 duration录制仍在进行录制结束时会添加 duration
未知事件类型自定义扩展事件检查 x 类型事件(扩展数据)
时间戳顺序错误文件已损坏事件的时间戳应单调递增
大文件导致 jq 超时文件过大,无法载入内存使用 --stream 标志,或先转换为 .txt
未找到标记录制中没有标记标记是可选的;并非所有录制都有标记
版本号错误旧版 cast 格式此技能涵盖 v2 格式(asciinema v3+)
tail 输出为空文件仅包含标头录制可能为空,或仅有一行

执行后反思

此技能执行完毕后,请在结束前检查:

  1. 命令是否成功? — 如果没有,请修正导致失败的说明或错误表。
  2. 参数或输出是否发生变化? — 如果底层工具的接口发生变化,请更新 Usage 示例和 Parameters 表,使其保持一致。
  3. 是否需要变通方案? — 如果你必须临时采用其他方式(不同的标志、额外步骤),请更新此 SKILL.md,以便下次调用无需再次采用相同的变通方案。

仅当问题确实存在且可复现时才更新,不要根据推测更新。

评论

支持 Markdown