
免费
纸片隐喻
把一个想法变成一张没有文字的剪纸插图,纸张有真实厚度和投影,脚本生成,一眼看懂。
安装
把“纸片隐喻”技能安装到 ~/.claude/skills/paper-metaphor。 下载下面每个文件,保存到这个文件夹: https://skilllift.pages.dev/packs/paper-metaphor/SKILL.zh.md → SKILL.md https://skilllift.pages.dev/packs/paper-metaphor/references/style.md → references/style.md https://skilllift.pages.dev/packs/paper-metaphor/references/elements.md → references/elements.md https://skilllift.pages.dev/packs/paper-metaphor/references/elements.zh.md → references/elements.zh.md https://skilllift.pages.dev/packs/paper-metaphor/references/element-sheet.png → references/element-sheet.png https://skilllift.pages.dev/packs/paper-metaphor/assets/engine.mjs → assets/engine.mjs https://skilllift.pages.dev/packs/paper-metaphor/assets/primitives.mjs → assets/primitives.mjs https://skilllift.pages.dev/packs/paper-metaphor/assets/elements.mjs → assets/elements.mjs https://skilllift.pages.dev/packs/paper-metaphor/assets/spec.template.json → assets/spec.template.json https://skilllift.pages.dev/packs/paper-metaphor/assets/series.example.json → assets/series.example.json https://skilllift.pages.dev/packs/paper-metaphor/scripts/check.mjs → scripts/check.mjs https://skilllift.pages.dev/packs/paper-metaphor/scripts/render.mjs → scripts/render.mjs https://skilllift.pages.dev/packs/paper-metaphor/scripts/sheet.mjs → scripts/sheet.mjs https://skilllift.pages.dev/packs/paper-metaphor/scripts/hover.mjs → scripts/hover.mjs 然后读一遍 SKILL.md,告诉我它是做什么的,并提醒我开一个新会话。
解压到 ~/.claude/skills
同一个技能,不同的需求
左边是预览。右边由另一个 Agent 按不同需求制作,它只有安装好的技能,没看过预览。
这是按虚构需求做的一次测试。系统字体不同时,字形可能略有差异。
把一个想法变成一张独立的编辑插图,一眼能看懂,用脚本生成层叠剪纸,不用任何图像模型。输入一个概念或一篇文章,交付 2400x1350 的 PNG、1200x675 的副本、可编辑的 SVG 和保存好的配置文件;做系列时,多张图用同一种视觉语言。每张都是由两到四个元素组成的紧凑视觉隐喻,图中没有文字。当有人要头图、文章配图、幻灯片开场图、一组概念插图,或者点名要剪纸风格插图时使用。
交付前必须通过
- 每张图一个想法,并用一句用户看过的隐喻句说清楚。
- 两到四个元素,每个都有真实的
means。 - 图里任何地方都没有文字、数字或字母形状。
- 盲读针对的是最终图;能启动读者时,由独立读者只看图完成。不能启动时,你的消息里说明了这一点。
- 写下了读者漏掉的内容;图片单独表达不了的想法,配好了标题。
- 手在 600 宽时看得出是手,手指衬着干净的纸面。
- 每张图都看过 1200 宽和 600 宽。
node scripts/check.mjs <文件夹>不带--draft时以 0 退出。- 系列只用一种背景。
- 列出了推断的内容和假设,没有编造任何内容。
阅读完整 SKILL.md
---
name: paper-metaphor
description: 把一个想法变成一张独立的编辑插图,一眼能看懂,用脚本生成层叠剪纸,不用任何图像模型。输入一个概念或一篇文章,交付 2400x1350 的 PNG、1200x675 的副本、可编辑的 SVG 和保存好的配置文件;做系列时,多张图用同一种视觉语言。每张都是由两到四个元素组成的紧凑视觉隐喻,图中没有文字。当有人要头图、文章配图、幻灯片开场图、一组概念插图,或者点名要剪纸风格插图时使用。
version: 1.0.0
---
# 纸片隐喻
一个想法,一张图,没有字。你负责找隐喻,并把元素写进 JSON 配置;纸由引擎来剪。不要用别的方式画这些形状,也不要运行任何图像模型。
精确的样式数值和背后的道理在 `references/style.md`。`references/elements.zh.md` 列出每个元素及其选项,`references/element-sheet.png` 是全部元素的总览图。你不需要读源代码。
## 需要问的信息
简报里没有的才问,一次问完。
1. 想法或文章。必填。
2. 要几张。默认一张。一篇有多个观点的文章可以做成系列,每张一个观点。
3. 背景色,六选一。默认按 `references/style.md` 的指引选。
## 简报很单薄时
- 只有一个词,比如“韧性”,也够了,不要再追问。复述它,然后用下面的方法。图片不做事实陈述,所以什么都不用编。
- 在 `idea` 里复述用户给的事实。任何字段都不得编造客户、数字、引语或资历。凡是你推断的内容,交付时列在“推断”下面。
- 没人能回答时:继续做,交付时列出你的假设。没有出处可写时:`source` 填 `未提供` 或 `not given`,这两个值都能通过检查。不需要提供链接,图里没有链接。
- 文章:挑出读者会转述给朋友的那一个论点,并说明你挑了哪个。如果文章有三个这样的论点,就提议做三张的系列。
- 想要别的长度或尺寸:本技能只出 16:9 的 2400 和 1200 两种尺寸,系列张数不限。直接说明,不要裁切。
## 找隐喻
按顺序、用大白话说出三样东西:
1. **这件事。** 想法说的是什么。信任。注意力。一个决定。
2. **变化。** 它发生了什么。一点点变多,也可能倒掉。很多人想要,而且会用完。切断了一条再也接不上的联系。
3. **能做到这个变化的实物。** 石堆一块一块变高,也可能塌。一枚硬币不可能同时给三只手。剪断缆绳的剪刀,无法撤销。
然后用一句话写出图上是什么,尽量带上一个人的动作。最终交付前,先用这一句话向用户提出这个隐喻。
### 想法是否定或比较时
“不是软弱”“难得多”才是这类句子的重点,只用“这件事、变化、实物”会把它们弄丢。单个物体表现不了“不”和“更”。请用下面的做法:
| 做法 | 适用于 | 怎么做 | 测试过的例子 |
|---|---|---|---|
| 两种状态并排,同一场景 | 否定:“X 不是 Y”;有或没有某样东西 | 同类物体的两种状态放在一张纸上,不加分隔线:人们害怕的情形,旁边是实际发生的情形 | “关上一扇门不是失败”:墨色 `door-closed`、纸色 `door-open`,中间一只 `hand-point` 指向开着的门 |
| 大小悬殊 | 比较:“难得多”“多得多”“比……容易” | 把差距变成看得见的大小,放在同一场景里,至少 3 比 1 | “守住信任比重建信任容易得多”:`scale` 的 `tilt` 设为 16,低的一盘放一块大的墨色 `stone`,高的一盘放一块小的纸色 `stone` |
| 同一样东西在变形 | “把 X 变成 Y”“从 X 到 Y” | 一种材料穿过画面,一路发生变化 | 碎纸进 `funnel`,出来是 `path-straight`;`tangle` 被抽成一根直的 `thread` |
只看图的盲读者对这两个测试的反应:两扇门:“一扇门关上,另一扇打开:选开着的路”,把握约七成;要点到了,“不是失败”只是隐含。天平:“一边比另一边重”,把握约七成半;比较到了,称的是什么没有到,所以需要标题。这些做法能传达关系,却很少能同时传达主题。
**图片做不到的事。** 图片只能展示东西和它们在做什么。它说不出“不”“因为”“应该”“差多少”,也说不出是谁的错,除非上面的做法能把这些变成看得见的差别,而有时什么做法都不行。所以要说实话:盲读只到达想法的一部分时,要么重画,要么把 `cold_read_verdict` 设为 `pass-with-headline`,把缺的话写进 `needs_headline`,并告诉用户这张图必须和这句标题一起用。例如:第二只手托住一块重石,能表达“重担有人分担”,表达不了“求助不是软弱”。绝不能把这样的图当作说全了整句话来交付。
检验隐喻:
- 它展示变化正在发生,而不只是话题。灯泡只说了“点子”,没有说出关于点子的任何看法。
- 两到四个物体,每一个都要有站得住的 `means`。说不出含义的就删掉。
- 不配文字也能成立。
示例:“把零散的想法变成清晰的路径”。这件事:零散的想法。变化:许多碎片变成一条线。实物:漏斗。句子:“零散的纸片倒进漏斗,出来时成了一条笔直的路。”
## 步骤
1. 找隐喻。写好 `thing`、`change`、`object`、`metaphor`。
2. 复制 `assets/spec.template.json` 并填写,或写系列文件(见“字段”)。所有 `REPLACE:` 都要在这一步替换掉。五个 `cold_read` 字段一开始是空的,到第 6 步才填,`--draft` 允许它们为空。位置用画布单位,见“单位”。
3. 先出小图,一次一张:`node scripts/render.mjs spec.json out --small`。它写出 `out/<name>-draft600.png`,用你的看图工具查看。脚本会打印每个元素占据的画布范围,你可以按数字调整。反复调的工作在这一步做,每次渲染一到三秒。
4. 完整渲染:`node scripts/render.mjs spec.json out`。写出 `<name>.png`、`<name>-1200.png`、`<name>.svg`、`<name>.spec.json`。
5. 运行技能里的 `node scripts/check.mjs out --draft`。改图,直到通过。不得修改检查脚本或其限值。
6. **对最终图做盲读。** 如果你能启动另一个智能体或读者,就必须这样做:把 `<name>-1200.png` 复制成一个不暗示想法的中性文件名,只把图交给对方,不给想法、不给隐喻,只问“你看到了什么,你觉得它在表达什么”。把对方的回答写进 `cold_read`,`cold_read_by` 设为 `independent-reader`。只有确实无法启动读者时,才由你自己在重读隐喻句之前写,只写看到的物体和它们在做什么,`cold_read_by` 设为 `self-no-reader-available`,并在交付时说明。
然后和 `idea` 对比。只有读者用自己的话说出了同一个论点才算通过,只说出话题不算。把读者漏掉的内容写进 `cold_read_missed`,没有漏掉就写 `nothing`。什么都没漏:判定 `pass`。漏掉的部分可以诚实地由图旁的文字承担:判定 `pass-with-headline`,并把这些文字写进 `needs_headline`。漏掉了要点:否决这张图并用上面的做法重画。不要改写盲读来迁就。把 `render.mjs` 打印的图稿编号抄进 `cold_read_art`。图稿一变,编号就变,`check.mjs` 就会要求重新盲读。
7. 重新渲染(同样的种子得到同样的文件),运行不带 `--draft` 的 `node scripts/check.mjs out`,必须以 0 退出。如果盲读是你自己写的,或这张图需要标题,它会打印提示,这两点都要转告用户。
8. 每张图都看 1200 宽和 600 宽两种尺寸,先看手。完成“交付前”清单后再交付。
一次真实的否决:“韧性”画成两块裂开的深色石头中间长出一株芽,通过了所有机器检查,盲读却是“一副墨镜上长出一株植物”。于是放弃,重画成一只墨色纸船骑在巨浪的浪尖上。
如果列表里的元素在实际尺寸下看起来不对,即使名字存在,你也可以用 `custom` 自己做。交付时说明,这样原有元素才能被修好。
## 字段
限值由 `render.mjs` 或 `check.mjs` 强制执行。
| 字段 | 含义 | 限值 | 简报单薄时 |
|---|---|---|---|
| `name` | 文件名 | 小写字母、数字、连字符,最多 48 个字符 | 按想法取名 |
| `idea` | 用户原话里的想法 | 必填 | 照抄用户的词或短语 |
| `thing` | 这件事,用大白话 | 必填 | 就是想法本身 |
| `change` | 它发生了什么 | 必填 | 写你的理解,并列入“推断” |
| `object` | 能做到这个变化的实物 | 必填 | 来自上面的方法 |
| `metaphor` | 一句话:图上是什么 | 一句话;英文 170 字符,中文 70 字 | 始终由你来写 |
| `source` | 用户给的文章标题或网址 | 可选,字符串 | `未提供` 或 `not given` |
| `background` | `clay` 陶土、`moss` 苔绿、`slate` 石板、`ochre` 赭黄、`plum` 梅紫、`pond` 池青,填英文名 | 须完全一致;每个系列一种 | `clay` |
| `seed` | 整数;相同种子生成相同文件 | 0 或更大 | `1` |
| `ground` | 可选的舞台条:`{"kind":"none\|water\|hill\|table","y":700,"front":74}`。`y` 是条的上沿,单位是画布单位。水面有第二条,画在元素前面,比第一条低 `front` 个单位 | 不算元素 | 除非有东西要站着或浮着,否则省略 |
| `cold_read` | 读者说图上画了什么、表达什么 | 英文 240 字符,中文 110 字;不得照抄 `metaphor`;第 6 步之前留空 | 必须看过图之后写 |
| `cold_read_by` | `independent-reader` 或 `self-no-reader-available` | 二选一。能启动读者时必须用读者 | 没用过读者绝不能声称用过 |
| `cold_read_missed` | 读者没有到达的那部分想法,或 `nothing` | 必填 | 照实写:如果没人提到“不是软弱”,那就是漏掉了 |
| `cold_read_verdict` | `pass`(什么都没漏)或 `pass-with-headline` | 有遗漏时不接受 `pass` | 盲读之前绝不能填 |
| `cold_read_art` | `render.mjs` 为被读那张图打印的图稿编号 | 必须与 SVG 一致,所以读的是旧稿就通不过 | 从渲染输出里抄 |
| `needs_headline` | 必须放在图旁、承担图表达不了的内容的文字 | `pass-with-headline` 时必填,否则省略 | 用用户自己的句子 |
| `elements` | 物体列表,按顺序绘制,后面的在上层 | 2 到 4 个 | 先从 2 个开始 |
`elements` 中每一项:
| 字段 | 含义 | 限值 | 默认值或简报单薄时 |
|---|---|---|---|
| `el` | 下面列表里的元素名,或 `custom` | 必须存在 | 列表里没有就自己做,见“缺元素时怎么做” |
| `means` | 它在隐喻中代表什么 | 必填;80 字符以内 | 说不出来就删掉这个元素 |
| `x`、`y` | 锚点放在哪里,单位是画布单位 | 数字 | 从画面中央 800 和 450 附近开始 |
| `size` | 元素未旋转时的最长边,单位是画布单位 | 至少 160;常用 250 到 700 | 主要物体用 500 |
| `anchor` | 元素的哪个点对准 `x`、`y`:`center`、`top`、`bottom`、`left`、`right`,或 `tip` 这类命名点 | 命名点见 `references/elements.zh.md` | `center`。要让指尖或捏合处准确落在某处时用 `tip` |
| `rotate` | 顺时针角度,绕锚点旋转 | 任意 | 0 |
| `flip` | 左右镜像,在旋转之前执行 | true 或 false | false。用它让手从需要的一侧伸入 |
| `tone` | 元素的主色 | `paper` 或 `ink` | `paper`。贴着其他纸色物体时用 `ink` |
| `lift` | 离开纸面的高度,决定投影 | 1 贴放,2 默认,3 悬空 | 2 |
| `bleed` | 是否有意从画面外伸入 | 范围的至少一半留在画面内,指尖必须在画面内 | false;只用于手、岸和悬崖。从左边或上边伸出时,投影仍可见。从右边或下边伸出时,投影落在画面外,`check.mjs` 会提示并只依据滤镜判断,所以要亲自看 |
| `params` | 该元素的选项,比如 `{"count":6}`。手可以设 `arm` 和 `sleeve` | 见 `references/elements.zh.md` | 省略 |
系列文件包含 `series`(标题,只存在于文件中,绝不会印到图上)、`background`、`seed`,以及 `illustrations`:一个列表,每项是上面的字段,但不写 `background` 和 `seed`。每张图的种子等于系列种子加它在列表中的序号。它用同一个命令 `render.mjs` 渲染,所有图写进同一个文件夹。完整可用的范例是 `assets/series.example.json`。要让系列更整齐,各张图的墨色比例和元素大小要接近。
“样图”“草稿”这类标注放在文件名、图注或你的消息里,绝不放进图中。
## 单位
- 画布:宽 1600,高 900,原点在左上角,y 向下增大。
- 1 个画布单位在 600 宽的图上是 0.375 像素。所以 `size` 为 160 的元素在 600 宽时是 60 像素,这是允许的最小值。
- 元素形状以及 `custom` 的所有形状和线宽,都使用大约 100 单位的设计框。之后整个元素按比例缩放,使最长边等于 `size`。所以在 `size` 为 700 的元素里,`width` 为 5 的线宽是 35 个画布单位,在 600 宽时约 13 像素。
- 缩放后每条线至少要有 10 个画布单位宽:设计框里的 `width` 不小于 1000 除以 `size`。可接受的最小 `width` 是 3。
## 元素
共 105 个元素,按类别排列。含义、选项和锚点见 `references/elements.zh.md`。
- **手:** `hand-open`、`hand-stop`、`hand-point`、`hand-pinch`、`hand-grip`、`hand-offer`、`hand-reach`、`hand-thumb`
- **门与入口:** `door-closed`、`door-open`、`door-ajar`、`archway`、`window`、`gate`
- **桥、梯与路:** `bridge-arch`、`bridge-rope`、`bridge-broken`、`ladder`、`stairs`、`path-winding`、`path-straight`、`fork-road`、`stepping-stones`、`signpost`、`flag`、`arrow-bent`
- **钥匙与锁扣:** `key`、`padlock`、`padlock-open`、`keyhole`、`chain`
- **植物:** `sprout`、`leaf`、`tree`、`tree-roots`、`flower`、`seed`、`potted-plant`
- **工具:** `hammer`、`wrench`、`scissors`、`pencil`、`saw`、`shovel`、`gear`、`magnifier`、`needle`、`funnel`、`compass-drawing`
- **天平、指南针与度量:** `scale`、`hourglass`、`compass`、`ruler`、`clock`
- **灯与光:** `lantern`、`candle`、`lighthouse`、`bulb`、`sun`、`moon`、`star`、`match`
- **船与水:** `boat-paper`、`sailboat`、`anchor`、`wave`、`bottle`、`bollard`
- **线与结:** `thread`、`rope-cut`、`knot`、`tangle`、`spool`、`rope-coil`
- **石头与山地:** `stone`、`cairn`、`pebbles`、`wall`、`mountain`、`cliff`
- **云与天空:** `cloud`、`rain-cloud`、`bird`、`kite`、`balloon`、`umbrella`
- **基本几何形:** `circle`、`square`、`triangle`、`half-circle`、`ring`、`cube`、`blocks`
- **有用途的物件:** `scraps`、`coin`、`coin-eye`、`eye`、`coin-stack`、`bowl`、`jar`、`basket`、`envelope`、`book`、`shield`、`egg`
手是一个人的手:手指、手掌和前臂是同一张纸剪出来的,手腕收窄,拇指是叠在上面的一层,掌纹和关节是细切口。每一种手势都在实际尺寸和 600 宽下查看过。不要把手指藏在其他物体后面。需要知道:
- `size` 包括前臂。要从画面外伸入,设 `"bleed": true`、`"params": {"arm": 110}`,`size` 用 800 到 1000,再用 `"anchor": "tip"` 定位。这时手本身约 400 个画布单位长。
- `arm` 为默认值 34 时,手臂末端是一条直切边,悬在半空会很怪:让它伸出画面,或让这一端靠着别的东西。`"sleeve": true` 会加一条对比色的长袖;不再有单独的袖口。长前臂要用它:盲读时,光着的长前臂被看成纸条或第二根绳子。
- `hand-grip` 握的物体与前臂成直角。`hand-offer` 的手指会超出 `tip` 约手长的 40%。`hand-pinch` 在左端捏线或小东西,前臂在右;要朝另一侧就用 `flip`。
## 缺元素时怎么做
需要的物体不在列表里,就自己做。不接受“差不多”的替代:不能用 `lantern` 代替路灯,不能用 `bowl` 代替帽子,也不能只用 `triangle` 代替帐篷。替代品会让陌生人看到错误的物体,盲读通不过。
使用 `"el": "custom"`,加上 `name`、可选的 `anchors`,以及最多 14 个 `pieces`。在 100 单位的设计框里用下列形状拼出来,从后往前排:
| 形状 | 字段 |
|---|---|
| `rect` | `x`、`y`、`w`、`h`,可选 `r`(圆角半径) |
| `ellipse` | `cx`、`cy`、`rx`,可选 `ry` |
| `poly` | `points`:`[[x,y],...]`,直边尖角 |
| `curve` | `points`,穿过这些点的平滑闭合轮廓 |
| `line` | `points`、`width`(至少 3),可选 `width_end`。一条圆头的剪纸带,用于把手、茎、绳子。三个点以上就是穿过这些点的平滑曲线,所以 4 到 12 个点就够 |
| `ring` | `cx`、`cy`、`r`、`hole` |
| `arc` | `cx`、`cy`、`r`、`hole`,`from`、`to` 是角度,0 指向右,顺时针 |
每个形状可以设 `tone`:`a` 主色,`b` 对比色,`s` 处于阴影中的主色,用于折面或远侧,`g` 背景色,用于镂空。示例,一辆独轮车,手扶在把手上:
```json
{ "el": "custom", "name": "wheelbarrow", "means": "要搬走的重担",
"x": 720, "y": 470, "size": 720, "lift": 2,
"anchors": { "tip": [8, 34] },
"pieces": [
{ "shape": "line", "points": [[8,34],[34,50],[62,62]], "width": 5, "tone": "b" },
{ "shape": "line", "points": [[46,60],[38,84]], "width": 5, "tone": "b" },
{ "shape": "line", "points": [[62,62],[72,76]], "width": 5, "tone": "b" },
{ "shape": "poly", "points": [[24,26],[92,26],[78,62],[38,62]], "tone": "a" },
{ "shape": "poly", "points": [[24,26],[38,26],[46,62],[38,62]], "tone": "s" },
{ "shape": "ring", "cx": 74, "cy": 78, "r": 14, "hole": 5, "tone": "b" }
] }
```
在它后面加上 `{ "el": "hand-grip", "means": "做这件事的人", "x": 420, "y": 390, "anchor": "tip", "size": 420, "lift": 3 }`,这张图可以通过检查。新元素要看剪影:600 宽时必须看得出是这个物体,而不是别的东西。把手、轮子、腿先画,大块形状后画。每条边都是手工剪的,所以相邻的形状要重叠一两个单位,不要刚好对齐,否则放大后可能露出细缝。绝不能用它拼文字或数字。
## 交付物
每张图:2400x1350 的 `<name>.png`、1200x675 的 `<name>-1200.png`、`<name>.svg`(每个元素一个命名分组,每片纸一条路径)、`<name>.spec.json`。系列放在同一文件夹,用同一背景。另外在消息里写明:隐喻句、盲读及其作者、漏掉的内容、这张图需要的标题、你的推断和假设。
## 交付前
- [ ] 每张图一个想法,并用一句用户看过的隐喻句说清楚。
- [ ] 两到四个元素,每个都有真实的 `means`。
- [ ] 图里任何地方都没有文字、数字或字母形状。
- [ ] 盲读针对的是最终图;能启动读者时,由独立读者只看图完成。不能启动时,你的消息里说明了这一点。
- [ ] 写下了读者漏掉的内容;图片单独表达不了的想法,配好了标题。
- [ ] 手在 600 宽时看得出是手,手指衬着干净的纸面。
- [ ] 每张图都看过 1200 宽和 600 宽。
- [ ] `node scripts/check.mjs <文件夹>` 不带 `--draft` 时以 0 退出。
- [ ] 系列只用一种背景。
- [ ] 列出了推断的内容和假设,没有编造任何内容。
## 不适用的情况
- 图必须展示真实数据、真实产品、真实人物或真实地点。
- 信息依赖图中的文字,比如金句卡或信息图。图旁配标题可以,图内有字不行。
- 简报要的是照片质感,或某家公司品牌的插画风格。
- 用图解更诚实时:如果想法是一个五步流程,就画图解。
## 运行要求
- Node 18 或更新版本。`scripts/check.mjs` 没有任何依赖,在这个文件夹里直接能运行。
- 渲染需要 Playwright 和 Chromium:`npm install playwright && npx playwright install chromium`。如果装在别处,把 `NODE_PATH` 设为那个 `node_modules` 文件夹。
- 只有可选的组装短片 `scripts/hover.mjs` 需要 ffmpeg。
- 用时:每张图一到三秒,四张图的短片约十秒。不用图像模型,不联网。同一台机器上,相同的配置和种子会生成逐字节相同的 SVG 和 PNG。
- 只关闭你自己启动的进程。一次只跑一个渲染,绝不要按进程名结束其他进程。



