免费

图表横扫

讲者栏固定不动,镜头沿大柱图从行名走到柱端,在每个数字上停顿。

安装

把“图表横扫”技能安装到 ~/.claude/skills/mb-chart-scan。
下载下面每个文件,保存到这个文件夹:
https://skilllift.pages.dev/packs/mb-chart-scan/SKILL.zh.md → SKILL.md
https://skilllift.pages.dev/packs/mb-chart-scan/references/style.md → references/style.md
https://skilllift.pages.dev/packs/mb-chart-scan/assets/engine.html → assets/engine.html
https://skilllift.pages.dev/packs/mb-chart-scan/assets/engine.js → assets/engine.js
https://skilllift.pages.dev/packs/mb-chart-scan/assets/fx-chart-scan.js → assets/fx-chart-scan.js
https://skilllift.pages.dev/packs/mb-chart-scan/assets/catalogue.json → assets/catalogue.json
https://skilllift.pages.dev/packs/mb-chart-scan/assets/library.json → assets/library.json
https://skilllift.pages.dev/packs/mb-chart-scan/assets/library.zh.json → assets/library.zh.json
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/render.mjs → scripts/render.mjs
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/check.mjs → scripts/check.mjs
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/sheet.mjs → scripts/sheet.mjs
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/shared.mjs → scripts/shared.mjs
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/cutout.mjs → scripts/cutout.mjs
https://skilllift.pages.dev/packs/mb-chart-scan/scripts/segment-person.swift → scripts/segment-person.swift
然后读一遍 SKILL.md,告诉我它是做什么的,并提醒我开一个新会话。

解压到 ~/.claude/skills

同一个技能,不同的需求

左边是预览。右边由另一个 Agent 按不同需求制作,它只有安装好的技能,没看过预览。

预览
预览
新需求,由另一个 Agent 制作
新需求,由另一个 Agent 制作

这是按虚构需求做的一次测试。系统字体不同时,字形可能略有差异。

有讲者时,窄窄的讲者栏固定在大柱图旁。镜头从行名沿柱子走到端点,在每个数字上停顿,再转到下一组,最后拉回看全图。适合带人读一张表。渲染成一个 1920x1080、30 fps、H.264 的 MP4,剪纸定格风格,支持中文和英文,四套配色,不生成实拍、配音或音乐。需要这类标题、图表、展示或片尾,或点名要这个技能时使用。

交付前必须通过

  • 对文件夹运行 check.mjs 退出码为 0,引用它的最后一行。
  • 看过最终 MP4 多个时间点的真实画面。
  • 屏幕上每个数字都在用户原文里,推断内容已列出。
  • 一个版本一种语言。
  • 虚构内容已通过 label 标明。
  • 没有生成实拍、配音或音乐。
阅读完整 SKILL.md
---
name: mb-chart-scan
description: 有讲者时,窄窄的讲者栏固定在大柱图旁。镜头从行名沿柱子走到端点,在每个数字上停顿,再转到下一组,最后拉回看全图。适合带人读一张表。渲染成一个 1920x1080、30 fps、H.264 的 MP4,剪纸定格风格,支持中文和英文,四套配色,不生成实拍、配音或音乐。需要这类标题、图表、展示或片尾,或点名要这个技能时使用。
version: 1.0.0
---

# 图表横扫

有讲者时,窄窄的讲者栏固定在大柱图旁。镜头从行名沿柱子走到端点,在每个数字上停顿,再转到下一组,最后拉回看全图。适合带人读一张表。

所有文字和数值都在一个 JSON 文件里,改完一条命令重新渲染。样式写死在 `assets/`,你负责填内容,不要改样式。精确的颜色和时序见 `references/style.md`。

## 先问清楚

简报里没有的,一次问完:

1. 表格数据:分组的行,每行一个名称和一个数字。讲者名字和图片可选。
2. 用户自己的文字或事实,原样放进 `"source"`。
3. 语言:`zh` 或 `en`。一个版本一种语言,两种都要就做两个 JSON。
4. 配色:`vermilion`、`cobalt`、`pine`、`apricot`。没人指定就用 cobalt。

**没人回答时:** 继续做,把假设列在回复最前面。

## 步骤

1. 新建文件夹写 `clip/beats.json`。`assets/library.zh.json` 和 `assets/library.json` 是填好的合法示例,抄结构,不要抄虚构文字。
2. 校验:`node <skill>/scripts/check.mjs clip/beats.json`,报什么改什么。
3. 渲染前先看:`node <skill>/scripts/sheet.mjs clip/beats.json clip/sheet.png --at 0.99`,打开图片;也试试 `--at 0.5`。
4. 渲染:`node <skill>/scripts/render.mjs clip/beats.json --out clip --flat`。
5. 检查观众实际看到的:`node <skill>/scripts/check.mjs clip`。改 JSON,重新渲染,再查,直到通过。
6. 从 MP4 抽几个时间点的真实画面看:`nice -n 10 ffmpeg -threads 2 -ss 2 -i clip/clip.mp4 -frames:v 1 f.png`。好不好看,检查脚本判断不了,只能你看。

`--at` 是要显示的时间点,用 0 到 1 的比例;一两个片段的拼图会画得足够大,方便判断。

选项:`--only clip --frame 120` 只重渲一帧,存到 `clip/frames/clip-120.png`。`--stills 0.3,0.6,1` 把静帧存到 `clip/frames/`。`--scale 0.5` 出草稿,存到 `clip/draft/clip.mp4`(用了 `--flat` 也一样),检查脚本不接受草稿。渲染很吃资源:先出小尺寸,不要同时跑两个渲染,也不要用按进程名批量结束进程的命令。

`check.mjs` 可以在技能安装的位置独立运行,参数可以是 JSON、文件夹(JSON 在别处时加 `--beats path/to/beats.json`)或任意 MP4。改过名的 MP4 要跑全部检查,请加 `--beats`。`check.mjs --test` 是短自检。它能查出:柱子比例错误、原文没有的数字、溢出、静止片段、尺寸或编码错误、占位文字。

## beats.json

```json
{
 "lang": "zh",
 "palette": "cobalt",
 "label": "虚构示例",
 "source": "虚构示例。面包销量。海港街:周一 120,周二 96,周三 140。山路店:周一 88,周二 104。",
 "beats": [
  {
   "id": "clip",
   "job": "compare",
   "effect": "chart-scan",
   "seconds": 10,
   "slots": {
    "title": "面包销量,虚构数据",
    "speaker": "何安娜",
    "role": "虚构的店主",
    "groups": [
     {
      "label": "海港街",
      "rows": [
       {
        "label": "周一",
        "value": 120
       },
       {
        "label": "周二",
        "value": 96
       },
       {
        "label": "周三",
        "value": 140
       }
      ]
     },
     {
      "label": "山路店",
      "rows": [
       {
        "label": "周一",
        "value": 88
       },
       {
        "label": "周二",
        "value": 104
       }
      ]
     }
    ]
   }
  }
 ]
}
```

| 字段 | 含义 | 上限 | 简报单薄时 |
|---|---|---|---|
| `lang` | 屏幕上所有文字的语言 | `zh` 或 `en` | 跟原文语言一致 |
| `palette` | 唯一的配色设置 | 四选一 | cobalt |
| `label` | 片段上的小标签 | 30 字以内,可选 | 示例内容填“虚构示例”;真实项目省略 |
| `source` | 用户原文,不做改动。屏幕上每个数字都必须能在这里找到 | 必填 | 给什么贴什么 |
| `keepLatin` | 中文版里允许保留拉丁字母的真实名称 | 列表,可选 | 省略 |
| `beats[].id` | 片段文件名 | 字母、数字、连字符 | clip |
| `beats[].job` | 照示例保留 | `compare` | `compare` |
| `beats[].effect` | 照示例保留 | `chart-scan` | `chart-scan` |
| `beats[].seconds` | 片段时长 | 6 到 14 | 10 |

## slots 里的每个字段

上限是中文字数。

| 字段 | 含义 | 上限(中文字数) | 简报单薄时 |
|---|---|---|---|
| `title` | 效果上方的标题,用脚本原话说明观众该得出什么。 | 22, 可选 | 省略。脚本没说的结论不要写。 |
| `speaker` | 图表旁固定栏里的名字,可选。 | 8, 可选 | 简报没提到人就省略;同时没有 person 时,图表占满全宽。绝不虚构团队。 |
| `role` | 原文写明的职务或身份。 | 12, 可选 | 原文写明才用,比如“测试用户”。否则省略,绝不虚构头衔。 |
| `person` | 对象:{"src":"cutout.png"},人物的透明 PNG,路径相对 JSON。可加 "face":{"x":0.3,"y":0.1,"w":0.4,"h":0.25},都是相对图片的比例。 | PNG, 可选 | 省略:会用一个明显通用的无脸剪纸人物。只有普通照片时,在 macOS 上运行 scripts/cutout.mjs。绝不生成写实人像。 |
| `prefix` | 数字前的符号,如 ¥。 | 2, 可选 | 简报写明单位才填,否则省略。 |
| `suffix` | 数字后的单位,如 % 或 页。 | 4, 可选 | 简报写明单位才填,否则省略。 |
| `groups.label` | 一组数据的名称。 | 10, 必填 | 用表格标题。只有一组也可以。 |
| `rows.label` | 一行的名称。 | 8, 必填 | 用表格原话。 |
| `rows.value` | 给定的数字。所有柱子共用一个从零开始的刻度。 | 数字, 必填 | 不许估算。缺数值就去掉这一行。 |
| `groups` | 列表(1 到 4 项) | | |

## 规则

**比例:** 所有柱子共用一个从零开始的刻度,跨组也一样,绝不超过真实长度。**数字:** 只显示给定数值,没有滚动数字。**讲者:** 可选。写了 `speaker` 或 `person`,图表旁就有一条从第一帧起固定的栏;都不写,图表占满全宽。绝不虚构团队。只有 `speaker` 没有 `person` 时用通用人物。只有普通照片时,在 macOS 上运行 `node scripts/cutout.mjs photo.jpg cutout.png`。**时长:** 每一站约 1 秒,每组 1.7 秒,每行 1 秒。**超过 12 行:** 拆成两个片段。

**不编造数字。** 每个数字都必须在 `source` 里,否则检查脚本判失败。**简报单薄时:** 用用户自己的话转述事实,绝不编造客户、数字、引语或资历,把推断的内容列在回复的“推断内容”下面。**没人能回答时:** 继续做并列出假设。**拼接片段:** 所有片段用同一配色,否则每次切换都会变色。**要其他时长:** 在范围内改 `seconds`。**没有真实链接:** 不要显示地址。**换行:** 词语会保持完整;断行别扭时,在文字里加 `\n`。

## 交付物

`clip/beats.json`(唯一需要改的文件)和 `clip/clip.mp4`:1920x1080、30 fps、H.264、yuv420p、无声。附说明:假设、推断内容、重新渲染的命令。

## 渲染时间

在 16 GB Mac 上实测,同时有其他任务,低优先级全尺寸:这个 10 秒片段用默认素材时 7 秒。

## 交付前检查

- [ ] 对文件夹运行 `check.mjs` 退出码为 0,引用它的最后一行。
- [ ] 看过最终 MP4 多个时间点的真实画面。
- [ ] 屏幕上每个数字都在用户原文里,推断内容已列出。
- [ ] 一个版本一种语言。
- [ ] 虚构内容已通过 `label` 标明。
- [ ] 没有生成实拍、配音或音乐。

## 什么时候不要用

数值无法共用一个从零开始的刻度,或重点是随时间的走势:请用折线图。它也不生成实拍、配音或音乐,不能严格匹配品牌色:这四套配色就是设计本身。

## 环境要求

- Node 18 及以上;ffmpeg 和 ffprobe 在 PATH 或 /opt/homebrew/bin。
- 渲染需要 Playwright:`npm install playwright`,再运行 `npx playwright install chromium`。装在别处时,把 `NODE_PATH` 设为那个 `node_modules`。`check.mjs` 不依赖任何包。
- 字体都是系统字体。没有 Avenir Next Condensed 或苹方时,用 `references/style.md` 里的备选字体并重新排版,请在那台机器上跑一遍检查。

用在这些流程里

相似技能