重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
asciinema-cast-format by terrylica/cc-skills
npx skills add https://github.com/terrylica/cc-skills --skill asciinema-cast-formatasciinema v3 .cast 文件格式参考文档(asciicast v2 规范)。
平台:所有平台(仅文档)
在以下情况下使用此技能:
Asciinema v3 使用 NDJSON(换行分隔的 JSON)格式:
第一行是一个 JSON 对象,包含以下字段:
| 字段 | 类型 | 必需 | 描述 |
|---|---|---|---|
version | int | 是 | 格式版本(对于 v3 录制始终为 2) |
width |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| int |
| 是 |
| 终端宽度(列数) |
height | int | 是 | 终端高度(行数) |
timestamp | int | 否 | 录制开始的 Unix 时间戳 |
duration | float | 否 | 总持续时间(秒) |
title | string | 否 | 录制标题 |
env | object | 否 | 环境变量(SHELL, TERM) |
theme | object | 否 | 终端颜色主题 |
{
"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"]
/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
/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-500MB | 1-5M | 使用 --stream 标志,考虑使用 ripgrep |
| 500MB+ | 5M+ | 首先使用 asciinema 转换为 .txt |
/usr/bin/env bash << 'STREAM_EOF'
# 流式处理大文件
jq --stream -n 'fromstream(1|truncate_stream(inputs))' recording.cast | head -1000
STREAM_EOF
对于非常大的文件,首先转换为纯文本:
asciinema convert -f txt recording.cast recording.txt
这会去除 ANSI 代码并生成干净的文本(通常压缩比为 950:1)。
1. [参考] 确定要分析的 .cast 文件
2. [头部] 提取并显示头部元数据
3. [事件] 按类型统计事件数量(o, i, m, r)
4. [分析] 根据用户需求提取相关事件数据
5. [导航] 如果需要,查找标记或特定时间戳
修改此技能后:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| jq 解析错误 | .cast 文件中的 NDJSON 无效 | 使用 jq -c . 检查每行是否为有效的 JSON |
| 头部缺少 duration | 录制正在进行中 | 录制结束时添加 duration |
| 未知事件类型 | 自定义扩展事件 | 检查 x 类型事件(扩展数据) |
| 时间戳乱序 | 文件损坏 | 事件应单调递增 |
| 大文件 jq 超时 | 文件太大无法在内存中处理 | 使用 --stream 标志或先转换为 .txt |
| 未找到标记 | 录制中没有标记 | 标记是可选的;并非所有录制都有标记 |
| 版本号错误 | 较旧的 cast 格式 | 此技能涵盖 v2 格式(asciinema v3+) |
| tail 输出为空 | 文件只有头部 | 录制可能为空或只有一行 |
每周安装次数
66
仓库
GitHub 星标数
26
首次出现
2026年1月24日
安全审计
安装于
opencode60
claude-code58
codex58
gemini-cli58
cursor57
github-copilot56
Reference documentation for the asciinema v3 .cast file format (asciicast v2 specification).
Platform : All platforms (documentation only)
Use this skill when:
Asciinema v3 uses NDJSON (Newline Delimited JSON) format:
The first line is a JSON object with these fields:
| Field | Type | Required | Description |
|---|---|---|---|
version | int | Yes | Format version (always 2 for v3 recordings) |
width | int | Yes | Terminal width in columns |
height | int | Yes | Terminal height in rows |
timestamp | int | No | Unix timestamp of recording start |
duration | float | No | Total duration in seconds |
title | string | No | Recording title |
env | object | No | Environment variables (SHELL, TERM) |
theme | object | No | Terminal color theme |
{
"version": 2,
"width": 120,
"height": 40,
"timestamp": 1703462400,
"duration": 3600.5,
"title": "Claude Code Session",
"env": { "SHELL": "/bin/zsh", "TERM": "xterm-256color" }
}
Each event after the header is a 3-element array:
[timestamp, event_type, data]
| Code | Name | Description | Data Format |
|---|---|---|---|
o | Output | Terminal output (stdout) | String |
i | Input | Terminal input (stdin) | String |
m | Marker | Named marker for navigation | String (marker name) |
r | Resize | Terminal resize event | "WIDTHxHEIGHT" |
[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"]
/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
/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
For recordings >100MB:
| File Size | Line Count | Approach |
|---|---|---|
| <100MB | <1M | jq streaming works fine |
| 100-500MB | 1-5M | Use --stream flag, consider ripgrep |
| 500MB+ | 5M+ | Convert to .txt first with asciinema |
/usr/bin/env bash << 'STREAM_EOF'
# Stream process large files
jq --stream -n 'fromstream(1|truncate_stream(inputs))' recording.cast | head -1000
STREAM_EOF
For very large files, convert to plain text first:
asciinema convert -f txt recording.cast recording.txt
This strips ANSI codes and produces clean text (typically 950:1 compression).
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
After modifying this skill:
| Issue | Cause | Solution |
|---|---|---|
| jq parse error | Invalid NDJSON in .cast file | Check each line is valid JSON with jq -c . |
| Header missing duration | Recording in progress | Duration added when recording ends |
| Unknown event type | Custom extension event | Check for x type events (extension data) |
| Timestamp out of order | Corrupted file | Events should be monotonically increasing |
| Large file jq timeout | File too big for in-memory | Use --stream flag or convert to .txt first |
| Markers not found | No markers in recording | Markers are optional; not all recordings have them |
Weekly Installs
66
Repository
GitHub Stars
26
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode60
claude-code58
codex58
gemini-cli58
cursor57
github-copilot56
Lark CLI Wiki API 使用指南:获取知识空间节点信息与权限管理
42,000 周安装
市场变动分析工具:应用商店榜单排名变化监控与ASO优化策略
481 周安装
LinkedIn帖子撰写指南:创作真实互动内容,建立个人品牌与思想领导力
480 周安装
Mapbox地理空间操作指南:几何计算与路径规划工具选择决策矩阵
489 周安装
Vitest 3.x 测试框架:Vite 驱动的下一代 JavaScript/TypeScript 测试工具
499 周安装
Next.js 功能标志使用指南:框架特性配置与运行时包管理详解
504 周安装
Sentry Node.js/Bun/Deno SDK 安装配置指南:服务器端JavaScript错误监控与性能剖析
494 周安装
x | Exit | Extension for custom data | Varies |
| Wrong version number | Older cast format | This skill covers v2 format (asciinema v3+) |
| Empty output from tail | File has only header | Recording may be empty or single-line |