# Chengfeng Visual

给剪好的口播配画面：在录屏上盖 HTML 层（圈重点标注 / 小黑整屏动画 /...

- Repository: https://github.com/Agentchengfeng/chengfeng-videocut-skills (3168 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-10-10
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add Agentchengfeng/chengfeng-videocut-skills --skill chengfeng-visual -g -a claude-code -y`
Codex: `npx skills add Agentchengfeng/chengfeng-videocut-skills --skill chengfeng-visual -g -a codex -y`
Cursor: `npx skills add Agentchengfeng/chengfeng-videocut-skills --skill chengfeng-visual -g -a cursor -y`
Gemini CLI: `npx skills add Agentchengfeng/chengfeng-videocut-skills --skill chengfeng-visual -g -a gemini-cli -y`

## Description

给剪好的口播配画面：在录屏上盖 HTML 层（圈重点标注 / 小黑整屏动画 / 推近），层绑字幕屏、由播放器逐帧驱动、直接在预览里看。用户说做分镜、配画面、加动画、圈重点、B-roll、做 storyboard 时使用。不要用于删词剪辑、字幕、物理剪切或成片渲染。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 画面（分镜）

**这是一件事，不是流程的一段。** 用户什么时候喊它就什么时候做，改完剪辑可以回来再做。

前提只有两个：**账本和字幕已经存在**（层按字幕屏放、时间从账本算）。

```text
需要   edit-list.json、transcript.json、subtitles.json
产出   visuals.json + modules/<序号-名字>/index.html
```

干完就停，**不指挥用户下一步**。

先读取并执行 [业务 Skill 的阶段合同](../../references/business-workflow-contract.md)。
模块写法的硬规矩见 [模块契约](references/visual-module-contract.md)，
判断规则见 [画面判断](references/visual-judgment.md)。

## 0. 就绪

先执行 [检查更新](../chengfeng-check-updates/SKILL.md) 的「就绪检查」, , skills 是否
最新、Runtime 是否配套；**插件根**也在那里定位（本文命令里的 `<插件根>` 都代入
那个字面路径）。只有「就绪」才继续；「需新会话」或「停」按它的处置执行
（含「禁止自制替代界面」禁令），业务 Skill 不自带环境逻辑。

若就绪结果为 `runtime.kind=desktop-managed`，直接复用桌面 App 已安装的稳定 CLI 与
同一 `launchd/windows-task` 服务；不要解析 Electron 路径、另装依赖或起第二个
Runtime。

## 命令

```bash
node "<插件根>/scripts/ensure-running.cjs" --json
node "<插件根>/scripts/videocut-cli.cjs" visual get   <project> --json
node "<插件根>/scripts/videocut-cli.cjs" visual frame <project> --cues sub-0004,sub-0005 --count 12 --out <dir> --json
node "<插件根>/scripts/videocut-cli.cjs" visual add   <project> --module modules/01-xx/index.html --cues sub-0004,sub-0005 [--zoom x,y,w,h] [--id vis-0001] --json
node "<插件根>/scripts/videocut-cli.cjs" visual remove <project> --id vis-0001 --json
```

`ensure-running` 必须先证明 canonical 5190 属于当前平台的托管服务；失败就透传并
停止，不回退 foreground 或自选端口。

层绑**字幕屏**（`--cues`），产品自己换算成词 id, , 层永远不可能绑上没人说的词，
剪辑变了层自己跟着挪。**不存秒数。**

## 四步，一步不跳

```text
① 文字定任务    读 subtitles.json，按语义分段，每段回答：
               教程/演示/证明，还是概念/逻辑/过渡？
② 抽帧看画面    visual frame 抽 8-12 帧，真的用眼睛看。
               实测 12 段里有 2 段被画面推翻文字预判, , 这步不是走形式
③ 量运动窗口    相邻帧做像素差，找出滚动/切换/操作的时刻。
               层只盖稳定窗口，圈在画面开始动之前退场
④ 做层放层     写模块 → visual add → 在预览里逐层核对
```

### ② 的判断规则

```text
画面正是他说的东西     → 标注：圈住、说到哪个词圈哪里。真证据不许盖
画面弱相关/空白       → 小黑动画：整屏白底，从风格库做
画面自身足够清楚      → 不动。这是最常见的正确答案（实测 13 段里 4 段不动）
```

### ③ 的产出物是数字，不是感觉

```text
圈的坐标      像素统计量出来（灰度扫描找文字行），不许目测, , 目测差过 50px
互动时刻      逐帧像素差找突变（实测一次从 4 跳到 335），圈在它之前 0.2s 退完
稳定窗口      开头常有滚动（他在找内容），层从停稳那屏的 cue 开始绑
```

The rest: https://github.com/Agentchengfeng/chengfeng-videocut-skills/blob/HEAD/plugins/chengfeng-videocut/skills/chengfeng-visual/SKILL.md
