1实现原理 · 为什么它能做到
自动化生成的核心是把命令列表翻译成 VHS tape 文件(Output/Set Theme/Set FontSize/Type/Enter/Sleep…),再交给 vhs 渲染成 GIF。
tape_lines = [ f'Output {output_gif}', f'Set Theme "{theme}"', f'Set FontSize {font_size}', f'Set Width {width}', f'Set Height {height}', f'Set Padding {padding}', 'Set TypingSpeed 10ms', 'Set Shell zsh', '', ]
录制是真实执行:main() 在无 --no-execute 时直接 subprocess 调 vhs,tape 中的命令会在 vhs 的模拟终端里真的敲下去并运行。
subprocess.run(['vhs', str(tape_file)], check=True)
VHS 解析器缺陷的规避:Type 串不能含 $、双引号、反引号,复杂命令先 base64 编码、运行时解码执行。
VHS `Type` strings cannot contain `$`, `"`, or backticks. These cause parse errors
自举/噪声过滤的『观众视角』编排:Hide 段跑 setup/cleanup → clear 清屏 → Show 后才开始录观众要看的命令。
tape_lines.append('Hide') … tape_lines.append('Show')
智能节奏:按命令语义给不同 Sleep(install/build/test/deploy→3s,ls/pwd/echo 等→1s,其余→2s),录完可用 gifsicle 变速后处理。
if any(kw in cmd.lower() for kw in ['install', 'build', 'test', 'deploy', 'marketplace']): sleep_time = '3s' elif any(kw in cmd.lower() for kw in ['ls', 'pwd', 'echo', 'cat', 'grep']): sleep_time = '1s' else: sleep_time = '2s'
三种附加模式:批量配置(batch_generate.py 读 YAML/JSON 逐个调用 auto 脚本)、交互录制(asciinema 录真会话→转 tape→vhs)、手写/模板 tape(assets/templates + placeholder 替换)。
cmd = [sys.executable, str(script_path)] for command in commands: cmd.extend(['-c', command])
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | vhs(charmbracelet,必需) |
| cli | gifsicle(可选,变速) |
| cli | asciinema(可选,交互录制) |
| cli | ffmpeg/ffprobe(可选,抽帧验证) |
| package | PyYAML(可选,batch YAML 配置) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 录制即真实执行任意命令 — tape 中的每条命令(含隐藏 setup、cleanup、包装函数)都会在录制终端的真实 shell 中运行;若命令串来自不可信来源,等于把任意代码交给本地执行。使用时应只录自己写/自己审过的命令。
- VHS 解析缺陷是注入通道 — Type 串对 $、双引号、反引号敏感,若绕过 base64 套路手写 tape,特殊字符可能造成解析错误或意外执行;filter 正则的引号边界需小心。
- 第三方工具链版本漂移 — vhs/gifsicle/asciinema 来自第三方(charmbracelet 等),语法与行为升级可能破坏现有 tape;SKILL.md 排障表覆盖常见症状但无法免疫漂移。
- 隐藏命令泄漏到成品 — Hide 段若缺 clear/Sleep 时序,清理/安装输出会进入最终 GIF,暴露内部命令或敏感路径;依赖模板纪律。
- 演示内容本身可能含敏感信息 — 真实执行意味着真实输出(路径、token 若被命令打印)会进 GIF——自举/过滤可挡噪声但挡不住命令自己 print 的敏感值。
5第二遍独立确认
- [ok] 自带脚本零网络外发 — scripts/ 三文件 token 扫描(URL/curl/wget/requests/urllib/socket/API_KEY/token/secret/os.system)零命中;子进程仅 vhs/gifsicle/cp/asciinema/sed。
- [ok] 执行面:tape 命令真实执行 — auto_generate_demo.py 主流程 subprocess.run(['vhs', str(tape_file)]);tape 中 Type+Enter 在 vhs 终端内被 shell 执行(VHS 工具行为)。
- [ok] --filter 的 base64 包装实现 — wrapper f-string + base64.b64encode + 'echo <b64> | base64 -d > /tmp/cw.sh && source /tmp/cw.sh' 在 create_tape_file 中逐字存在。
- [ok] 变速后处理(gifsicle delay = 10//speed) — speed_up_gif 内 gifsicle -d{delay} tmp '#0-' 且先 cp 到 /tmp 再写回,与 SKILL.md 手写 gifsicle 命令一致。
- [ok] 自举/隐藏命令防泄漏(Hide→clear→Show) — create_tape_file 在有 bootstrap/filter 时依次 append Hide/Type/Enter/Sleep/Type "clear"/Show;SKILL.md 有同序说明。
- [ok] 批处理与交互模式调用链成立 — batch_generate 重建 auto_generate_demo argv(-c 循环);record_interactive.sh 走 asciinema rec → 写 tape → vhs < tape。
- [ok] 功能声明 vs 夸大检查 — description 八项能力全部有代码/SKILL.md 支撑;无越界承诺。依赖标注(VHS 必需、gifsicle/asciinema/ffmpeg/PyYAML 可选)与脚本内降级提示一致。
- [ok] 元数据(license/stars/commit) — 仓库级 MIT、stars=1385、pushed_at=2026-09-09T12:33:29Z;本地 HEAD==pin d5c4678cb5d4fd6acc9c922690df035dbd33d247。
6结论
9991cfcecc32bad8…d5c4678cb5