免费

歪歪涂鸦

线条不匀、颜色微微错位的手绘小怪物、食物和小物件,由脚本从 127 张原创涂鸦里画出来,可出透明贴纸,也可出带大标题的成品帖子

安装

把“歪歪涂鸦”技能安装到 ~/.claude/skills/wonky-doodles。
下载下面每个文件,保存到这个文件夹:
https://skilllift.pages.dev/packs/wonky-doodles/SKILL.zh.md → SKILL.md
https://skilllift.pages.dev/packs/wonky-doodles/references/style.md → references/style.md
https://skilllift.pages.dev/packs/wonky-doodles/assets/CREDITS.txt → assets/CREDITS.txt
https://skilllift.pages.dev/packs/wonky-doodles/assets/palettes.json → assets/palettes.json
https://skilllift.pages.dev/packs/wonky-doodles/assets/fonts/OFL-PatrickHand.txt → assets/fonts/OFL-PatrickHand.txt
https://skilllift.pages.dev/packs/wonky-doodles/assets/fonts/OFL-Xiaolai.txt → assets/fonts/OFL-Xiaolai.txt
https://skilllift.pages.dev/packs/wonky-doodles/assets/fonts/PatrickHand-Regular.ttf → assets/fonts/PatrickHand-Regular.ttf
https://skilllift.pages.dev/packs/wonky-doodles/assets/fonts/Xiaolai-subset.ttf → assets/fonts/Xiaolai-subset.ttf
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/backstop.mjs → assets/engine/backstop.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/build.mjs → assets/engine/build.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/doodles-creatures.mjs → assets/engine/doodles-creatures.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/doodles-food.mjs → assets/engine/doodles-food.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/doodles-plants.mjs → assets/engine/doodles-plants.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/doodles-tools.mjs → assets/engine/doodles-tools.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/doodles-world.mjs → assets/engine/doodles-world.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/font.mjs → assets/engine/font.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/library.mjs → assets/engine/library.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/pen.mjs → assets/engine/pen.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/engine/raster.mjs → assets/engine/raster.mjs
https://skilllift.pages.dev/packs/wonky-doodles/assets/vendor/rough-LICENSE.txt → assets/vendor/rough-LICENSE.txt
https://skilllift.pages.dev/packs/wonky-doodles/assets/vendor/rough.esm.mjs → assets/vendor/rough.esm.mjs
https://skilllift.pages.dev/packs/wonky-doodles/scripts/check.mjs → scripts/check.mjs
https://skilllift.pages.dev/packs/wonky-doodles/scripts/doodle.mjs → scripts/doodle.mjs
https://skilllift.pages.dev/packs/wonky-doodles/scripts/preview.mjs → scripts/preview.mjs
然后读一遍 SKILL.md,告诉我它是做什么的,并提醒我开一个新会话。

解压到 ~/.claude/skills

同一个技能,不同的需求

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

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

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

不用任何图像模型,由脚本生成可爱、歪歪扭扭的手绘涂鸦。可以画单张、贴纸页或一小组主题图,素材来自 127 张原创涂鸦:小怪物、食物、植物、工具、天气、小房子、爱心、星星和乱线,线条不匀,颜色微微错位,还有带性格的小脸。输出透明背景的 2048 像素 PNG、整页拼图、带真正大标题的成品帖子(1080x1080 和 1080x1350)和可编辑 SVG,相同种子得到相同文件。当有人要给社交帖子、幻灯片、通讯或小品牌配可爱涂鸦、贴纸、手绘小插图,或点名要这种风格时使用。

交付前必须通过

  • 我打开看过每页盲读图、每张交付的 PNG 和每张拼图。
  • cold-read.json 是在重读需求之前写的,每条都确实相符。
  • 没有一张涂鸦像知名角色、吉祥物、标志或品牌,不管它叫什么。名单查不了这个,是我自己查的。
  • 没有拿相近的东西替代要求的东西。缺的要么组合绘制,要么如实说明。
  • 这些涂鸦看起来像插画师的速写本,表情各不相同。
  • 标注是用户自己的话,或者没有标注。没有编造名字、数字或说法。
  • 虚构的样例在 footnote 里明确写出,不只写在 title 里。
  • 如果有标题,它是 headline,而且我按手机尺寸看过整张帖子。
  • node scripts/check.mjs out/ 不带 --pixels-only 时退出码为 0。如果手工改过 SVG,我已说明并使用了 --allow-edits。
  • 我列出了自己的假设。
阅读完整 SKILL.md
---
name: wonky-doodles
description: 不用任何图像模型,由脚本生成可爱、歪歪扭扭的手绘涂鸦。可以画单张、贴纸页或一小组主题图,素材来自 127 张原创涂鸦:小怪物、食物、植物、工具、天气、小房子、爱心、星星和乱线,线条不匀,颜色微微错位,还有带性格的小脸。输出透明背景的 2048 像素 PNG、整页拼图、带真正大标题的成品帖子(1080x1080 和 1080x1350)和可编辑 SVG,相同种子得到相同文件。当有人要给社交帖子、幻灯片、通讯或小品牌配可爱涂鸦、贴纸、手绘小插图,或点名要这种风格时使用。
version: 1.1.0
---

# 歪歪涂鸦

画风写在 `assets/engine/` 和 `assets/palettes.json` 里。你要做的是挑内容、配色、种子和简短标注,然后认真看结果。不需要读源码。精确参数见 `references/style.md`。

绘图引擎是 Rough.js,随包附带 MIT 许可(见 `assets/CREDITS.txt`),署名保留在包内。

## 需要问的内容

简报里没有的,一次性在一条消息里问清楚。

必填:
1. 主题,或要画的东西清单。

选填:
2. 用在哪里(决定模式:单张、一组、贴纸、成品帖子)。
3. 配色方案,或对方自己的两种颜色。
4. 大标题或简短标注,用对方自己的话。默认不写字。
5. 种子,如果对方想复现或改动以前的结果。

## 简报太单薄时

- **只有主题。** 用 `--find` 搜主题词,挑 6 张轮廓各不相同的涂鸦。复述主题,不要编造对方生意上的事实,并把你的选择列为推断。
- **主题没有匹配的涂鸦。** `--find` 以退出码 3 结束。想清楚这个主题里有哪些具体的东西,然后组合绘制(见下文)。如果说不出能画的具体东西,就告诉用户并请他给几个。绝不能拿不相关的涂鸦凑数,假装切题。
- **没人能回答,而且对方根本没给主题。** 就用 `heart, star, sparkle, flower-burst, scribble-ball, confetti`,配色 `pencil-box`,种子 1,并把这些列为假设。这一组能通过检查。
- **其他问题没人能回答。** 用 `set` 模式、`pencil-box` 配色、种子 1、不写字,并在回复里列出这些假设。
- **对方想要别的数量。** 按要求画,每次 1 到 60 张。绝不靠重复凑数。如果超过素材库里这个主题能提供的数量,就组合绘制其余的,或者如实说能画多少。
- **对方要在图上放标题。** 那就是 `headline`,用 `post` 模式或放在拼图上,绝不是某张涂鸦下面的标注。
- **没给标注。** 就不写字。绝不编造口号、店名、价格或日期。
- **链接。** 输出里没有链接,不需要提供。

## 必须拒绝的请求

每张涂鸦都要原创、通用。如果请求的是知名角色、吉祥物、标志或品牌,或者“画个像它的”,不管是点名还是一看就知道在说谁(著名的卡通老鼠、游戏里的口袋小怪、麦片盒上的老虎、某公司的标志),都要拒绝,并提议改画一个原创的通用形象。

`doodle.mjs` 和 `check.mjs` 会拒绝一份简短兜底名单上的名字(退出码 4),范围包括 items、标注、大标题、title、组合绘制的 id 和 name。**任何名单都列不全,所以必须由你来判断。** 名单只看名字,看不见图,通过了也说明不了什么。一张涂鸦只要长得像知名角色,不管叫什么名字,甚至没有名字,也一样要拒绝:穿短上衣的圆耳朵黄熊、戴蝴蝶结的白猫、红脸蛋的黄色小怪。问自己:陌生人看到它,会不会说出某个作品或公司的名字?会的话就改掉或拒绝。配色偶然落到一个普通动物身上时尤其要留意。绝不能靠改名绕过名单。

## 步骤

1. 先看有什么。
   ```
   node scripts/doodle.mjs --list --lang zh
   node scripts/doodle.mjs --find 烘焙
   node scripts/doodle.mjs --palettes
   ```
2. 写任务文件,简单的话也可以直接用 `--things`。字段含义见下表。
3. 渲染。每张约 0.4 秒,只需要 Node 18 以上:不用浏览器,不用 Playwright,不用图像模型,不用联网。
   ```
   node scripts/doodle.mjs --job job.json --out out/
   node scripts/doodle.mjs --things "cat, heart, sun" --mode set --palette pond-morning --seed 7 --out out/
   node scripts/doodle.mjs --things "moon, cat, alarm-clock" --mode post --headline "再睡五分钟" --palette pond-morning --seed 5 --out out/
   ```
4. 跑机器检查:`node scripts/check.mjs out/ --pixels-only`。修好它报告的问题。
5. 做盲读(见下一节)。盲读图把每张涂鸦按 300 像素和 96 像素各显示一次,只有编号,没有名字,也没有标注。每一页都要打开。**在重读需求之前**写好 `out/cold-read.json`。
6. 打开每张要交付的 PNG 和每张拼图。脚本看不出可爱,也看不出意思。
7. 跑最终检查:`node scripts/check.mjs out/`,退出码必须是 0。
8. 交付文件夹,并列出你的假设。

## 盲读

`check.mjs` 判断不了可爱和含义,只能靠你。对盲读图上的每个编号,写下陌生人会说它是什么。你手里已经有需求,做不到真正的盲:先看图,写下直白的描述,然后才和需求对照。脚本只相信你写的内容,所以全凭诚实。如实写“可能是番茄”才是这一步的意义。

```json
[
  { "n": 1, "stranger_says": "一杯冒热气、睡眼惺忪的咖啡", "matches_request": true, "looks_like_known": false },
  { "n": 2, "stranger_says": "一个红色的圆水果,可能是番茄", "matches_request": false, "looks_like_known": false }
]
```

| 字段 | 含义 | 限制 |
|---|---|---|
| `n` | 盲读图上的编号 | 整数,按顺序,每张涂鸦一条 |
| `stranger_says` | 陌生人会给出的直白描述 | 3 到 120 个字符,每张分别描述 |
| `matches_request` | 只有这句话说出了要求的东西或明显的同义词时才写 true | 全部为 true 才能通过 |
| `looks_like_known` | 陌生人看到它能说出某个知名角色、吉祥物或品牌时写 true | 全部为 false 才能通过 |

如果某条是 false,就换掉这张涂鸦(换心情、换种子,或组合画一张更好的),或者告诉用户画不了。不要为了通过而改描述,也不要交付 false 的条目。

## 任务文件

任务文件是 JSON,字段如下,完整示例见下文。包里的 `example/` 文件夹只是样例展示,不会被安装,不要去找它。

| 字段 | 含义 | 单位和限制 | 简报单薄时 |
|---|---|---|---|
| `title` | 这次任务是什么,写入清单和拼图 SVG 的标题 | 文字,最多 60 个字符 | 直白写明用途 |
| `mode` | `single`:一张,无拼图。`set`:每页最多 9 张。`sheet`:贴纸,每页最多 16 张,默认带贴纸白边。`post`:带大标题的不透明成品图,最多 6 张涂鸦 | 四选一 | `set`;对方要能直接发布时用 `post` |
| `headline` | 手写大标题。用于 `post`、`set`、`sheet` 模式。分页时只在第一页 | 最多 2 行(用 `\n` 换行),每行最多 24 个拉丁字符或 12 个汉字 | 不写。只用对方自己的话 |
| `sizes` | 帖子尺寸 | `1080x1080`、`1080x1350` | 两个都出 |
| `background` | 帖子背景色的角色 | `paper`、`a`、`b`、`c`、`d`。线条色对它至少 3:1 | `paper` |
| `footnote` | 拼图或帖子底部的一行小字。虚构样例用它写“Sample: fictional ...” | 最多 40 个字符 | 虚构样例必须写,其他不写 |
| `palette` | 配色名或 `custom` | `pencil-box`、`jam-toast`、`pond-morning`、`blue-biro`、`plum-rain`、`old-almanac`、`custom` | `pencil-box` |
| `custom` | 仅配合 `custom`:先线条色,后填充色 | 正好两个 `"#RRGGBB"`。线条色对白色对比度至少 4.5:1,对填充色至少 2.2:1 | 不要猜品牌色 |
| `seed` | 固定所有抖动。相同任务和种子得到相同文件 | 整数,1 到 2147483647 | 1;想要新画法就换种子 |
| `sticker` | 给每张涂鸦加一圈不透明的纸边 | true 或 false | `sheet` 为 true,其他为 false |
| `items` | 要画的东西,每张一项。可以直接写名字代替对象 | 1 到 60 项,不可重复。长清单会自动分页。超过 60 就分几次跑 | 从 `--find` 里挑 |
| `items[].doodle` | `--list` 里的 id、英文名或中文名,或组合绘制的 id | 只接受精确匹配。相近的名字会报错,这是有意设计的 | 没有默认值,绝不能猜 |
| `items[].label` | 涂鸦下方的手写字 | 最多 14 个拉丁字符或 8 个汉字,不换行 | 不写 |
| `items[].mood` | 脸的心情,只对 `--list` 里标 `(mood)` 的涂鸦有效 | content、smug、sleepy、worried、shocked、side-eye、one-tooth、blep、wink、grumpy、dreamy、whistling、teary、determined、yawn。“开心”用 content 或 dreamy;“睡着”用 sleepy,它自带一个 Z,不要再加 | 不写 |
| `items[].swap` | 交换颜色角色来给单张换色,例如 `{"c":"a"}` | 角色 `a`、`b`、`c`、`d` | 不写 |
| `compose` | 你用基本图形组合的额外涂鸦 | 见下文 | 需要时才用 |

## 组合绘制缺少的东西

如果要画的东西不在素材库里,**相近的替代品一律不行**。别人要“雾”,不能给一朵云;要“高脚杯”,不能给一个杯子。`doodle.mjs` 会以退出码 3 结束,并说明缺了什么。这时就组合绘制,然后像其他涂鸦一样做盲读。如果画出来看不出是那个东西,就告诉用户,不要交付。

完整示例:一只纸灯笼。在 1000 x 1000 的绘图空间里从后往前画,引擎会把它缩放到画布上并加上抖动。

```json
{
  "title": "一只纸灯笼",
  "mode": "single",
  "palette": "old-almanac",
  "seed": 8,
  "compose": [{
    "id": "paper-lantern",
    "name": "纸灯笼",
    "parts": [
      { "shape": "line", "points": [[500, 30], [508, 150]] },
      { "shape": "line", "points": [[470, 800], [460, 900], [440, 960]], "w": 0.9 },
      { "shape": "line", "points": [[500, 800], [505, 900], [500, 975]], "w": 0.9 },
      { "shape": "line", "points": [[530, 800], [545, 900], [565, 960]], "w": 0.9 },
      { "shape": "oval", "x": 500, "y": 470, "rx": 340, "ry": 290, "fill": "b" },
      { "shape": "line", "points": [[500, 185], [340, 470], [500, 755]], "w": 0.8 },
      { "shape": "line", "points": [[500, 185], [660, 470], [500, 755]], "w": 0.8 },
      { "shape": "rbox", "x": 380, "y": 130, "width": 240, "height": 70, "r": 16, "fill": "a" },
      { "shape": "rbox", "x": 390, "y": 740, "width": 220, "height": 66, "r": 16, "fill": "a" },
      { "shape": "face", "x": 500, "y": 460, "size": 1.15, "mood": "content" }
    ]
  }],
  "items": [{ "doodle": "paper-lantern" }]
}
```

顺序很重要:先画吊绳和流苏,灯笼身遮住它们的线头,再画骨架、上下盖和脸。思路是:先找到一眼能说明它是什么的轮廓(两个盖子之间一个宽椭圆),再加两三个决定性的细节(骨架、流苏),其余都省掉。

| 组合字段 | 含义 | 限制 |
|---|---|---|
| `id` | 你给它起的名字,在 `items` 里引用 | 小写字母、数字、短横线,最多 32 个字符,不能和素材库重名 |
| `name` | 用直白的话说它画的是什么 | 1 到 40 个字符 |
| `parts` | 图形,按顺序绘制,后画的盖住先画的 | 3 到 80 个 |
| `shape` | `blob` 闭合曲线,`poly` 闭合直边,`line` 开放曲线,`seg` 开放直线,`patch` 无轮廓色块,`hatch` 排线阴影,`tube` 带轮廓粗线,`oval` 椭圆,`box` 方框,`rbox` 圆角框,`dot` 实心点,`star` 星形,`face` 脸 | 选其一 |
| `points` | blob、poly、line、seg、patch、hatch、tube 的路径点 | 2 到 40 个 `[x, y]`,绘图单位,-200 到 1200 |
| `x`、`y`、`rx`、`ry` | 椭圆圆心和半径。也是 dot、star、face 的中心,box、rbox 的左上角 | 绘图单位,画布宽 1000 |
| `width`、`height`、`r` | 方框尺寸和圆角;tube 的粗细;dot 的半径 | 绘图单位 |
| `R` | 星形外半径,`r` 为内半径 | 绘图单位 |
| `fill` | `a` 暖色,`b` 热烈色,`c` 叶子冷色,`d` 天空冷色,`paper`,`ink`,或 `none`(透明) | 不写时为不透明的纸色 |
| `color` | 线条颜色的角色,默认 ink | 同上 |
| `w` | 线宽倍数 | 0.6 到 3,细节用小于 1 |
| `gap`、`angle` | 仅 hatch:间距(最终像素)和角度(度) | 默认 30 和 -38 |
| `size`、`mood`、`blush`、`z`、`style` | 仅 face:1 表示宽 216 单位;心情之一;false 去掉腮红;false 去掉 sleepy 的 Z;`dots`、`beans`、`wide`、`rings`、`lopsided` 或 `blush-dots` | size 为 0.5 到 2.5 |

## 脸和背景

- 什么东西都带脸,就成了剪贴画。素材库里大多数物件特意没有脸。让带脸的少于四分之三,心情也要不同。引擎会在一次任务里轮换眼睛和腮红的样式,同一张脸重复太多时 `check.mjs` 会打印警告。警告不会让检查失败,但还是要处理。
- 涂鸦和拼图的 PNG 是透明的。放在深色版面上,线条会沉进背景:请用 `"sticker": true`,纸边能保持清晰。遇到零散图形(彩纸、闪光),纸边会变成一整块圆润的底,就像真正的模切贴纸。
- 帖子是有意做成不透明的,也是唯一不透明的输出。

## 交付内容

输出文件夹里有:
- `doodles/NN-id.png`:透明背景 2048 x 2048,每张涂鸦一个。
- `doodles/NN-id.svg`:同一张画,可编辑,不依赖外部文件。
- `sheet.png` 和 `sheet.svg`(或 `sheet-1`、`sheet-2`……),`single` 模式没有。
- `post-1080x1080.png`、`post-1080x1350.png` 及其 SVG,`post` 模式才有。
- `cold-read-sheet.png`(或分页):用来盲读,不用交付。
- `cold-read.json`:你写的盲读。
- `manifest.json`:任务、种子、配色和文件哈希。

## 交付前检查

- [ ] 我打开看过每页盲读图、每张交付的 PNG 和每张拼图。
- [ ] `cold-read.json` 是在重读需求之前写的,每条都确实相符。
- [ ] 没有一张涂鸦像知名角色、吉祥物、标志或品牌,不管它叫什么。名单查不了这个,是我自己查的。
- [ ] 没有拿相近的东西替代要求的东西。缺的要么组合绘制,要么如实说明。
- [ ] 这些涂鸦看起来像插画师的速写本,表情各不相同。
- [ ] 标注是用户自己的话,或者没有标注。没有编造名字、数字或说法。
- [ ] 虚构的样例在 `footnote` 里明确写出,不只写在 `title` 里。
- [ ] 如果有标题,它是 `headline`,而且我按手机尺寸看过整张帖子。
- [ ] `node scripts/check.mjs out/` 不带 `--pixels-only` 时退出码为 0。如果手工改过 SVG,我已说明并使用了 `--allow-edits`。
- [ ] 我列出了自己的假设。

`check.mjs` 会在这些情况下失败:背景不透明;图形被边缘裁切或贴边;拼图里涂鸦互相重叠;300 像素下线条太细;颜色不在配色内;墨量太少;涂鸦重复;PNG 和 SVG 对不上;SVG 和种子生成的结果不同;有外部引用;有占位内容;贴纸裂成几块;帖子尺寸不对或不是不透明;名字在兜底名单上;盲读缺失或未通过。同一张脸重复太多时只警告,不判失败。

## 不适合的情况

- 写实、绘画感或必须严格贴合品牌的插画。
- 图表和示意图,这些需要精确,抖动会歪曲数据。
- 严肃的题材:疾病、哀悼、灾难。小笑脸在这里会显得像嘲讽。
- 知名角色、吉祥物或标志。
- 大段文字。标注只适合一两个词。

## 运行要求

Node.js 18 及以上,无需安装其他东西。引擎随包附带,包括 Rough.js、Patrick Hand 和小赖字体及其许可。每张涂鸦约 0.4 秒,每页拼图约 1 秒,40 张的清单约 15 秒。不需要 Playwright。只有用 `scripts/preview.mjs` 重建预览时才用到 ffmpeg,安装者可以不管。

相似技能