Skill: jianshuo/wjs-publishing-wechat (version 0.1.0)

--- name: wjs-publishing-wechat description: Use when the user wants to write or publish a 微信公众号 (WeChat Official Account) article — they share rough thoughts, a draft, or notes and ask for help polishing, generating a cover image (题图) and explanation illustration (解释图), or preparing the article for upload to mp.weixin.qq.com. Triggers include "写一篇微信文章", "公众号", "润色", "题图", "发公众号", "/wjs-publishing-wechat". --- # wjs-publishing-wechat 帮助用户写微信公众号文章。**轻润色，不重写。** 自动生成题图和解释图，输出可直接粘贴到公众号后台的内容包。 ## Core Principle **保留作者的语气和节奏。** 用户的思路和表达方式是文章的灵魂。你只做四件事： 1. 修明显错字和重复字 2. 调整段落（微信读者习惯短段落，每段 1–3 句） 3. 抚平特别拗口的句子（保守，能不动就不动） 4. 准备配套素材（题图、标题候选、摘要） **不要做的事：** - 不要改变作者的用词偏好 - 不要加 AI 味儿的连接词（"首先"、"其次"、"综上所述"、"总而言之"、"值得注意的是"） - 不要把口语改成书面语 - 不要加 emoji（除非原文有） - 不要重新组织段落顺序 - 不要"提升"作者的表达——他写他的，你只是清洁工 ## When This Skill Fires - 用户提供一段思路、草稿、或语音转写文字 - 用户说"帮我写一篇公众号"、"润色一下"、"准备发布" - 用户在公众号写作工作目录下工作（默认 `~/wechat-publish/` 或 `~/code/wechat-publish/`，可由用户配置） ## Workflow ### Step 0: 接收输入 用户会以以下形式给你内容： - 完整草稿（最常见） - 几段散乱的思路 / bullet points - 一段长文字，没有分段 - 语音转写（可能有错字、重复） 如果输入太散，**问一个问题**："这是想写一篇文章，还是几个独立想法？" —— 但只问这一次。 ### Step 1: 轻润色 打开一个 markdown 文件，把用户的内容粘进去。然后**只**做下面这些： - 修错字（"的得地"乱用、同音字错字、重复字"我我"） - 段落切分：每 1–3 句一段。微信里长段落很难读 - 拗口的地方做最小改动。如果改动后语气变了，宁可不改 - 标点统一：中文用全角逗号句号，英文/数字之间空格 - 保留原本的开头和结尾——这是作者的标志性特征 **改动的尺度参考：** 如果你改的字数超过原文的 5%，你改太多了。退回去。 ### Step 2: 标题候选 给用户 **3 个标题候选**： - A) 直白型：直接说文章讲什么 - B) 故事型：从一个场景或冲突切入 - C) 用户原文里的一句话：从草稿里摘最有味道的一句 不要做：标题党、夸张、"震惊"、"必看"。 ### Step 3: 摘要 (50–80 字) 公众号摘要是发到朋友圈/对话框时的预览。要点： - 不是文章第一段的复制 - 一句话说清楚读者会获得什么 - 用作者的语气，不是营销腔 ### Step 4: 配图（每篇两张） 每篇文章配 **两张图**: - **题图 cover.png** — 进入文章前的封面,**严格 2.35:1**(900×383, 即 900÷383=2.349),进 WeChat 编辑器封面字段。强字体、强构图、文字主导 - **解释图 illustration.png** — 正文里的配图,**比例由内容决定**(模型自选),帮读者一眼看懂文章核心结构。扁平卡通,有标签和流程 **题图固定走 AI 生成**（不问用户，每张约 $0.05–0.20）： ```bash ~/.claude/skills/wjs-publishing-wechat/gen-cover-ai.sh <article-folder> ["目标字词"] ``` - 不传第二个参数时，从 `meta.json` 取 `title` 当目标字词 - 内部调用 `gpt-image-2-skill`，**强制走 `--provider codex`**（不再支持 OpenAI API key fallback） - 默认尺寸 `1536x1024`（最接近 2.35:1 的 landscape），自动 sips 居中裁到 900×383 - 原图保存为 `cover-raw.png`，裁剪后是 `cover.png` - `cover-prompt.md` 作为 `--instructions`（设计哲学），短生成指令作为 `--prompt`——这样 gpt-5.4 能消化长 prompt 后再调 image_generation 工具 - 可调环境变量：`WECHAT_PUBLISH_IMAGE_SIZE`（默认 `1536x1024`）、`WECHAT_PUBLISH_IMAGE_QUALITY`（默认 `high`） **前置依赖**：必须装好 `gpt-image-2-skill`： ```bash git clone https://github.com/Wangnov/gpt-image-2-skill /tmp/g cp -r /tmp/g/skills/gpt-image-2-skill ~/.claude/skills/ ``` 并且必须有 Codex 鉴权： - **唯一支持**：Codex `~/.codex/auth.json`（ChatGPT Plus 计划即可，**不需要 OpenAI 组织验证**，gpt-image-2 的中文字渲染明显比 gpt-image-1 准确） - **不再支持** `OPENAI_API_KEY` 直连（`--instructions` 仅 Codex provider 支持，且 API 模式会绕过 Codex 的 prompt 优化） **目标字词**的选择：文章标题往往是长短语（如「AI 能力的三个简单层次」），但 prompt 模板对单字 / 两字词更友好。可以建议用户挑核心概念字词： > 目标字词用什么？默认是文章标题。建议挑一个核心概念字词（1–4 字），比如「AI 能力的三个简单层次」可以用「三层」或「层次」。 **然后生成解释图**(无需问用户,自动跑): ```bash ~/.claude/skills/wjs-publishing-wechat/gen-illustration.sh <article-folder> ``` - 读 `article.md` 全文,作为 instructions 传给 gpt-image-2 - 模型理解文章核心结构后,生成扁平卡通解释图 - **不裁剪**,模型自选画幅(双行对照通常出 3:2,流程类用横长条,层级深度用竖版) - 输出 `illustration.png`,直接用作正文配图 如果用户对某张图不满意,直接重跑对应脚本——每次结果不同。 ### Step 5: 输出文件包 在用户的工作目录下（默认 `~/wechat-publish/articles/`）创建文件夹： ``` articles/2026-05-09-{slug}/ ├── article.md # 润色后的 markdown 源文件 ├── article.html # 转成 HTML，直接粘贴用 ├── cover.png # 题图 900×383 (2.35:1 严格) ├── illustration.png # 解释图（任意比例，模型自选） ├── meta.json # { title, summary, author, date, slug } └── original.md # 用户原始输入，备份 ``` `{slug}` 从标题生成：拼音首字母 + 关键词，限制 30 字符以内。例如"我的第一台 Mac" → `my-first-mac`。 **article.html 转换规则：** - 用 `pandoc` 或简单的 markdown 解析（不需要复杂样式，公众号编辑器会重新排版） - 保留段落分隔（`<p>`） - 保留加粗（`<strong>`）和列表 - 不要内联 CSS——公众号会清掉 ```bash pandoc article.md -f markdown -t html -o article.html # 如果没有 pandoc: # 用 Python 的 markdown 包 / Node 的 marked / 或手写最简实现 ``` ### Step 6: 发布（用 `upload-draft.sh` 走 md2wechat 底层） 文章包准备好后，跑一行就能把文章作为草稿推到公众号后台： ```bash ~/.claude/skills/wjs-publishing-wechat/upload-draft.sh \ <workspace>/articles/YYYY-MM-DD-{slug} ``` 脚本内部做了 4 件事（用 `md2wechat` 的低层命令，绕过它高层 `convert` 的 API key 限制）： 1. `md2wechat upload_image cover.png` → 拿到 `thumb_media_id` 2. `md2wechat upload_image illustration.png` → 拿到 WeChat CDN `wechat_url` 3. 从 `article.md` 生成 `content.html`（去掉 frontmatter 和正文 H1，段落加内联样式，`./illustration.png` 替换成 CDN URL），再从 `meta.json` 装出 `draft.json` 4. `md2wechat create_draft draft.json` → 返回草稿 `media_id` **前置依赖**： - `md2wechat` CLI 已安装并配置好 `WECHAT_APPID` + `WECHAT_SECRET`（`md2wechat config show` 验证） - **当前公网 IP 已加进公众号后台白名单**：mp.weixin.qq.com → 设置与开发 → 基本配置 → IP 白名单。漏掉这一步会返回 `errcode=40164`，加白名单几十秒生效 - 详细命令、provider 选择、品牌档案，参考 `/md2wechat` skill **为什么不用 `md2wechat convert --draft`？** 实测发现这条「一键」路径在默认配置下走不通： - `--mode api`（默认）需要 `MD2WECHAT_API_KEY`（md2wechat.cn 付费云渲染服务），普通用户没有 - `--mode ai` 不直接出 HTML，而是返回一份 prompt 让外部 AI 渲染，不闭环 所以本 skill 用 `upload_image` + `create_draft` 两条底层命令组合，自己拼 HTML 和 draft JSON。`upload-draft.sh` 把这套流程封装成一行。 **Step 6.1 — 可选：先 inspect / preview 检查** ```bash cd <workspace>/articles/YYYY-MM-DD-{slug} md2wechat inspect article.md # 检查元数据、字数、发布就绪状态 md2wechat preview article.md # 生成本地 HTML 预览（degraded 模式，能看个大概） ``` 发布前如想确认元数据有没有超长、摘要是不是空，跑 `inspect`。否则直接跳到 6.2。 **Step 6.2 — 一行发布** ```bash ~/.claude/skills/wjs-publishing-wechat/upload-draft.sh \ /Users/jianshuo/code/wechat-publish/articles/YYYY-MM-DD-{slug} ``` 成功后输出 `draft media_id`，并在文章目录里留下 `content.html` 和 `draft.json` 两个产物，便于复查或下次直接 `md2wechat create_draft draft.json` 重发。 **Step 6.3 — 后台预览发布** 登录 https://mp.weixin.qq.com → 草稿箱 → 找到刚上传的文章 → 手机预览 → 发布。 **如果出错**： - `errcode=40164 not in whitelist`：把当前公网 IP 加进 WeChat MP 后台白名单 - `errcode=45004`：`meta.json` 的 `summary` 为空或太短 - 封面相关：确认 `cover.png` 路径正确、尺寸 ≥ 900×383 - token / appid：`md2wechat config validate` 看配置 **Optional — 高级排版**：如需第一屏判断、CTA、作者名片等模块，在 `article.md` 加 `:::block` 语法（需要 `MD2WECHAT_API_KEY` 才能渲染）。本 skill 默认不加，保持作者原文清洁。 输出给用户的最后一段话，固定格式： ``` 准备好了。文章在 articles/YYYY-MM-DD-{slug}/ 发布（一行）： ~/.claude/skills/wjs-publishing-wechat/upload-draft.sh \ articles/YYYY-MM-DD-{slug} 成功后到 mp.weixin.qq.com 草稿箱预览 / 发布。 article.md 是源文件，下次改用这个。 ``` ## File Layout (skill 自身) ``` ~/.claude/skills/wjs-publishing-wechat/ ├── SKILL.md # 本文件 ├── cover-prompt.md # AI 题图 prompt 模板（[目标字词] 占位符） ├── gen-cover-ai.sh # 题图: 2.35:1 强约束, 自动裁到 900×383 ├── illustration-prompt.md # AI 解释图 prompt 模板（[文章内容] 占位符） ├── gen-illustration.sh # 解释图: 比例自适应, 不裁剪 └── upload-draft.sh # Step 6 主路径：upload_image × 2 + create_draft ``` 依赖的外部 skill： - `gpt-image-2-skill`（github.com/Wangnov/gpt-image-2-skill）—— gen-cover-ai.sh / gen-illustration.sh 走这里调 gpt-image-2，**只走 `--provider codex`**（两个脚本已硬编码），需要 `~/.codex/auth.json`。不支持 OpenAI API key 直连 - `/md2wechat` skill / `md2wechat` CLI —— upload-draft.sh 用它的 `upload_image` + `create_draft` 命令（需要 `WECHAT_APPID` / `WECHAT_SECRET`，且当前 IP 在白名单里） > 注：仓库里仍保留 `publish.sh`（浏览器 + 剪贴板手动发布流），仅作为 md2wechat 配置未就绪 / 不能加 IP 白名单时的备用方案。本 skill 默认路径不再使用它。 > Auto-publish: 本 skill 由 `~/.claude/skills-publish-hook.sh` 自动同步到 [github.com/jianshuo/claude-skills](https://github.com/jianshuo/claude-skills)（每次编辑后自动 commit + push）。 ## Polish Heuristics (具体到字) 错字模式 → 改： - "的得地" 误用：根据语法判断 - 重复字："我我"、"是是"、"了了" → 删一个 - 同音字：考虑上下文（"在"vs"再"，"做"vs"作"） 段落切分时机： - 一句话讲完一个意思，下一句换主语 → 分段 - 出现"但是"、"不过"、"所以"、"后来"在句首 → 考虑分段 - 一段超过 80 字 → 找最近的句号分 不要分段： - 排比句、列举（保持节奏） - 对话（按对话格式） ## Anti-Patterns (绝对不做) | 不要 | 原因 | |------|------| | 把"我觉得"改成"笔者认为" | 改变了作者身份 | | 加"小标题"打断行文 | 微信读者不需要导航 | | 把口语句尾"吧/呢/啊"删掉 | 删掉就不是这个人写的了 | | 在结尾加"欢迎关注"、"点赞在看" | 作者会自己决定要不要 | | 把"今天"改成具体日期 | 作者用"今天"是有意为之 | | 自己加举例 / 引用 / 数据 | 这是写作，不是补全 | | 改动后没给 diff，直接全文输出 | 用户看不见你改了什么 | ## Showing the Diff 每次润色完，**先告诉用户你改了什么**，再问要不要继续： ``` 我改了 7 处： 1. L3: "我我觉得" → "我觉得"（重复字） 2. L8: 长段落 (120字) 拆成两段 3. L15: "通过…的方式" → "用…"（口语化保留） ... 要看完整结果吗？ ``` 如果改动 ≤ 3 处，可以直接给完整结果，不用列 diff。 ## Running the Skill (实操步骤) 1. 确认工作目录（默认 `~/wechat-publish/`，可由用户配置） 2. 接收用户输入（粘贴或文件） 3. 写 `original.md`（用户原始输入） 4. 写 `article.md`（润色版）→ 列 diff 给用户 5. 用 AskUserQuestion 问标题候选 6. 自动跑 gen-cover-ai.sh 生成题图 + gen-illustration.sh 生成解释图（不问用户） 7. 生成 `article.html`、`meta.json` 8. 输出发布指引 ## Done When - [ ] `articles/YYYY-MM-DD-{slug}/` 文件夹存在 - [ ] 包含 article.md、article.html、cover.png、meta.json、original.md - [ ] meta.json 字段齐全 - [ ] 用户拿到了发布指引 - [ ] 用户没说"再改改"

path: README.md
content: # wjs-publishing-wechat

Claude Code skill for writing and publishing **微信公众号 (WeChat Official Account)** articles, with AI-generated covers, AI-generated explanation illustrations, and a one-command upload helper.

Built around three principles:

1. **Light polish, no rewriting.** Preserve the author's voice. The skill fixes typos and paragraph spacing; it does not "improve" the prose.
2. **Two images per article.** A 2.35:1 typographic cover (题图) for the WeChat editor's cover field, and an aspect-ratio-flexible cartoon illustration (解释图) for the article body.
3. **Tier-1 publishing assist.** Open browser, reveal cover in Finder, push body HTML to clipboard as rich text — paste into mp.weixin.qq.com in ~2 minutes.

## What it does

```
draft → polish (light)
      → title + summary
      → cover (typographic, 900×383)
      → illustration (cartoon, model-chosen ratio)
      → article folder
      → publish.sh: open browser + clipboard
      → paste into mp.weixin.qq.com
```

Each article ends up in a dated folder:

```
articles/2026-05-09-my-slug/
├── original.md          # your raw input (backup)
├── article.md           # lightly polished markdown
├── article.html         # rich-text HTML for pasting
├── cover.png            # 题图 900×383 (2.35:1, strict)
├── illustration.png     # 解释图 (any ratio, AI picks)
├── meta.json            # title / summary / author / slug
└── cover-prompt-used.txt
```

## Install

```bash
git clone https://github.com/jianshuo/wjs-publishing-wechat ~/.claude/skills/wjs-publishing-wechat
```

Then in Claude Code, the skill auto-fires on prompts like "写一篇公众号", "润色", "准备发布", or "/wjs-publishing-wechat".

## Dependencies

- **macOS** (uses `sips`, `pbcopy`, `osascript`, `open`)
- **Python 3** (for markdown→html conversion and meta parsing)
- **Node.js** (for the AI image generation wrapper)
- **[gpt-image-2-skill](https://github.com/Wangnov/gpt-image-2-skill)** — required for AI cover and illustration. Install:

  ```bash
  git clone https://github.com/Wangnov/gpt-image-2-skill /tmp/g
  cp -r /tmp/g/skills/gpt-image-2-skill ~/.claude/skills/
  ```

  Auth: either `OPENAI_API_KEY` (needs OpenAI org verification for `gpt-image-2`) **or** Codex `~/.codex/auth.json` (any ChatGPT Plus account works, no verification needed — recommended).

- **Optional**: `pandoc` for nicer markdown→html. The fallback is a built-in minimal converter.

## Usage

The skill does most of the work for you. After it asks 1–2 clarifying questions and produces the article folder, three scripts handle the assets:

```bash
DIR=articles/YYYY-MM-DD-slug

# Generate the typographic cover (2.35:1, auto-cropped to 900×383)
~/.claude/skills/wjs-publishing-wechat/gen-cover-ai.sh "$DIR" "目标字词"

# Generate the cartoon explanation image (any aspect ratio)
~/.claude/skills/wjs-publishing-wechat/gen-illustration.sh "$DIR"

# Open browser, reveal cover, push HTML to clipboard
~/.claude/skills/wjs-publishing-wechat/publish.sh "$DIR"
```

Each script is idempotent — re-run it to get a different result (image generations are stochastic).

## Customization

Both image generators read prompt templates that you can edit:

- **`cover-prompt.md`** — the cover (题图) design philosophy, with `[目标字词]` placeholder. Locked to 2.35:1.
- **`illustration-prompt.md`** — the illustration (解释图) style guide, with `[文章内容]` placeholder. Aspect ratio chosen by the model based on content.

Environment variables (optional):
- `WECHAT_PUBLISH_IMAGE_SIZE` — default `1536x1024`
- `WECHAT_PUBLISH_IMAGE_QUALITY` — `auto` / `low` / `medium` / `high` (default `high`)

## Files

```
.
├── SKILL.md                    # how the skill behaves (its prompt)
├── cover-prompt.md             # AI cover prompt template
├── cover-template.html         # HTML/CSS fallback cover (no AI)
├── render-cover.sh             # render the HTML/CSS cover
├── gen-cover-ai.sh             # AI cover via gpt-image-2 → 900×383
├── illustration-prompt.md      # AI illustration prompt template
├── gen-illustration.sh         # AI illustration, no crop
└── publish.sh                  # Tier-1 publish helper
```

## Why two images?

The 题图 is the cover the reader sees in the WeChat feed *before* clicking. It needs maximum punch in 2.35:1 (900×383, the exact dimensions of the WeChat cover slot). Typography wins here.

The 解释图 lives inside the article. It needs to teach. A cartoon explanation often helps readers grasp the idea before reading the text. Forcing this image into the cover ratio destroys it. Different jobs, different aspect ratios.

## What this skill explicitly does NOT do

- It does not rewrite your prose. If you want an LLM to ghostwrite, this is the wrong tool.
- It does not auto-publish via WeChat API (Tier 1 only — opens browser + clipboard). Tier 2 (browser automation) and Tier 3 (official API, requires 服务号 + 企业认证) are not implemented.
- It does not manage 公众号 accounts, follower analytics, or scheduled posts.

## License

MIT — see [LICENSE](LICENSE).

## Author

[Wang Jianshuo (王建硕)](https://github.com/jianshuo) — built for my own 公众号 workflow, shared for anyone with the same problem.


path: cover-prompt.md
content: ★ 硬约束(最高优先级,不可违反): 最终图像必须是 **2.35:1 横版比例**(900×383, 微信公众号封面槽精确尺寸)。本约束覆盖下面第八章关于画幅自适应的所有内容——不允许选择竖版、方形、超宽、或其他比例。所有构图、字体、隐喻元素都必须为 2.35:1 横版做出适配。

---

先从用户那里得到一个「目标字词」，生成一张顶级字体美学概念图像。

这张图像的首要任务不是做一个漂亮背景，也不是做一个普通艺术海报，而是让「[目标字词]」成为画面中最强、最大、最醒目、最有记忆点的视觉主体。

「[目标字词]」必须在第一眼被看到、被读懂、被感受到。文字必须拥有压倒性的主视觉权重，占据画面最重要的位置，不能被背景、人物、物件、装饰、光影或场景削弱。所有其他视觉元素都只能围绕文字展开，服务文字，解释文字，强化文字，不能抢走文字。

画面应当围绕「[目标字词]」的含义、情绪、象征、文化联想、心理张力和深层隐喻来生成。请先理解这个字或词到底意味着什么，再决定适合它的视觉风格、字体结构、色彩、材质、空间、构图、画幅比例和辅助元素。

不要预设固定风格。不要固定竖版。不要固定明亮风格。不要固定暗黑风格。不要所有词都做成同一种设计。每一个输入的字或词，都应该生成完全不同的视觉气质。最终图像应该让人感觉:这个画面只能属于这个词，换成别的词就不成立。

---

一、最重要原则:文字必须绝对突出

「[目标字词]」必须是画面的绝对主角。

请确保:

1. 文字在画面中尺寸足够大。
2. 文字位于视觉中心、黄金位置或最强视觉区域。
3. 文字与背景有清晰对比。
4. 文字不能被大量元素遮挡。
5. 文字不能缩小成装饰。
6. 文字不能像海报标题一样附属在画面边缘。
7. 文字不能被场景淹没。
8. 文字不能只是贴在背景上的普通字。
9. 文字必须具有强烈字体设计感。
10. 观者第一眼必须先看到文字，再看到其他元素。

文字可以与图形、物件、空间、光影发生互动，但所有互动都必须增强文字，而不是破坏文字。

如果画面中有物件、人物、建筑、自然元素、抽象符号或场景，它们必须围绕文字排列，形成对文字的指向、包围、托举、衬托、解释或对比。

画面中的视觉层级必须是:

第一层级:目标字词
第二层级:围绕文字的核心隐喻元素
第三层级:背景、氛围、纹理、细节

绝不能让第二层级或第三层级超过文字。

---

二、先理解文字，再生成画面

请在生成图像之前，先从语义上理解「[目标字词]」。

请判断它属于哪种精神类型:

它是情绪类词语，还是概念类词语?
它是抽象哲学词，还是具体物象词?
它是温柔、强烈、压抑、崇高、荒诞、冷静、危险、诗意、神秘、锋利、混乱，还是庄严?
它更适合东方美学、现代主义、未来主义、古典主义、极简主义、超现实主义、表现主义、构成主义、奢侈品牌视觉，还是实验字体设计?
它的核心隐喻是什么?
它最应该被转化成什么视觉符号?
它应该给观者的第一感受是什么?
它最适合什么画幅比例?
它的空间应该是展开、压缩、坠落、上升、包围、断裂、凝聚、扩散，还是循环?

请特别避免只抓住词语最表层、最俗套的含义。
请优先寻找更深层、更有设计价值的隐喻。

例如:

不要把「自由」简单理解成蓝天和鸟，而要理解成边界消失、限制被打开、结构松动、空间扩张、重力减弱、自我脱离框架。
不要把「欲望」简单理解成红色和火焰，而要理解成引力、靠近、拉扯、占有、空洞、诱惑、无法停止的趋近。
不要把「控制」简单理解成锁和网格，而要理解成测量、规训、坐标、权限、边界、系统化、被允许与被禁止。
不要把「孤独」简单理解成一个人，而要理解成回应的缺席、尺度失衡、过大的空白、声音无法抵达、关系断裂。
不要把「焦虑」简单理解成红色警告，而要理解成未来过度逼近、结构无法对齐、信息过密、呼吸空间被压缩。
不要把「文明」简单理解成城市和柱子，而要理解成秩序、记忆、文字、制度、档案、神话、尺度、累积与废墟。
不要把「时间」简单理解成钟表，而要理解成残影、重复、消逝、叠印、风化、延迟、回声和不可逆。
不要把「深度」简单理解成黑洞，而要理解成层次、未知、内部空间、看不见的底部、由表及里的视觉递进。

请对任何输入词都进行这样的深层隐喻转译。

最终图像应该不是"这个词的插图"，而是"这个词的视觉思想"。

---

三、文字本身必须体现隐喻

「[目标字词]」不应该只是普通文字加背景。文字本身就必须表达含义。

请通过字形结构表达隐喻:

可以改变笔画比例。
可以拉伸字形。
可以压缩字形。
可以让字形局部断裂。
可以让笔画向某个方向生长。
可以让文字被某种力量牵引。
可以让文字内部出现负形图像。
可以让文字边缘产生象征性变化。
可以让文字与图形互相嵌套。
可以让文字成为一个容器。
可以让文字像建筑、像器物、像生物、像符号、像地图、像系统。

但必须保证文字清晰可读。

如果是中文:

请准确呈现每个汉字。
必须尊重汉字基本结构。
不能多笔、少笔、错笔、乱码或伪中文。
可以融合书法、碑刻、现代标题字、几何字体、实验字体、品牌字体、建筑字体、雕塑字体等方式。
偏旁、重心、笔画粗细、间架结构必须有设计感。
字体要像专门为这个词定制，而不是普通系统字体。
字形可以被主题影响，但不能被主题毁掉。

如果是英文:

请准确拼写。
不能多字母、漏字母、错字母。
字距、字重、比例、基线、节奏、负形空间必须高级。
字体要像定制标题字或品牌级字体资产。
可以切割、变形、压缩、拉伸、叠加、镂空，但必须可读。
字形可以被主题影响，但不能被主题毁掉。

---

四、围绕文字建立隐喻系统

画面不能只有文字，但所有元素必须围绕文字服务。

请围绕「[目标字词]」建立一个清晰的视觉隐喻系统。

这个系统可以由以下元素组成:

象征物件
抽象图形
几何结构
空间结构
自然元素
机械系统
建筑元素
身体隐喻
光影关系
材质变化
色彩冲突
符号系统
文字内部负形
前景遮挡
背景空间
重复、残影、镜像、断裂、扩张、压缩、漂浮、坠落、燃烧、冻结、溶解、生长、锁定、消散等动态关系

但请严格控制元素数量。不是元素越多越好，而是隐喻越准确越好。

辅助元素的作用只能是:

解释文字
增强文字
指向文字
包围文字
托举文字
压迫文字
释放文字
撕裂文字
限制文字
扩展文字
与文字形成视觉双关

请优先使用少量但准确的核心隐喻元素，而不是大量平庸符号。
一个精准的隐喻元素胜过十个装饰元素。

不要把辅助元素做成独立插画。不要让背景比文字更复杂。不要随机堆砌符号。不要使用和词义无关的装饰。

---

五、风格必须根据词义自适应

不要固定使用同一种风格。

请根据「[目标字词]」选择最合适的视觉风格。风格可以是以下任意一种或组合，但必须由词义决定:

高级极简平面设计
强构成主义海报
瑞士网格系统
日本当代平面设计
东方书法与现代版式
奢侈品牌编辑视觉
未来主义科技视觉
古典碑铭与现代设计融合
超现实主义概念海报
先锋杂志封面
高端文化展览海报
抽象表现主义字体实验
新包豪斯几何设计
艺术书籍封面风格
雕塑化字体装置
高对比图形设计
诗意留白视觉
复杂但有秩序的概念拼贴
冷静理性的系统化设计
强烈情绪化的视觉冲击海报
高端品牌主视觉
艺术摄影与字体融合
实验海报设计
高级出版物封面设计
建筑化字体视觉
视觉诗歌式字体海报

例如:

表达秩序的词，不应该做成混乱涂鸦。
表达混乱的词，也不应该做成过于稳定的理性网格。
表达温柔的词，不应该做成锋利金属。
表达权力的词，不应该做成轻飘飘的插画。
表达孤独的词，不一定要暗黑，可以是巨大空白。
表达欲望的词，不一定要火焰，可以是引力和拉扯。
表达科技的词，不一定要蓝色电路，可以是冷静、精准、透明和结构化。
表达生命的词，不一定要花草，可以是生长逻辑和有机结构。

请让风格真正来源于词义，而不是来自模板。
同一个提示词面对不同文字时，应该生成完全不同的视觉人格。

---

六、高级感判断标准

请让画面具有真正的高级感，而不是廉价复杂感。

高级感来自:

准确的隐喻
强烈的视觉层级
克制的元素数量
清晰的构图逻辑
成熟的色彩关系
精致的字体结构
有意识的留白
恰到好处的材质
稳定但不无聊的秩序
细节服务整体
远看有力量，近看有细节

高级感不来自:

堆满元素
过度发光
随机装饰
复杂背景
廉价金属质感
俗气霓虹
过度拟真
过度炫技
无意义渐变
AI随机纹理
看起来很"满"但没有思想

请让画面像由顶级艺术指导、字体设计师和平面设计师共同完成，而不是由模板生成。

---

七、构图要求:文字最大，隐喻围绕文字展开

请使用强烈、专业、有冲击力的构图。

构图必须确保文字优先。

可采用:

巨大文字主导构图:文字占据画面 50% 以上面积，其他元素围绕或穿插。
中心纪念碑构图:文字像核心图腾，所有元素向它聚集。
极简留白构图:文字巨大而克制，少量隐喻元素精准出现。
压迫式构图:元素从四周压向文字，表现压力、控制、欲望、焦虑。
释放式构图:文字向外扩展，元素被打开、断裂、飞散。
分层构图:文字在前景或中景极其醒目，隐喻元素在后方形成层次。
图形包围构图:圆、框、线、箭头、波纹、符号围绕文字建立系统。
局部裁切构图:巨大文字被画面边缘裁切，制造尺度和冲击力。
负形隐喻构图:文字内部或周围负形隐藏第二层含义。
对比构图:文字与隐喻元素形成强烈冲突，例如秩序与混乱、自由与限制、生命与机械。

请避免:

文字太小。
文字被放在角落。
文字只是标题。
背景比文字抢眼。
人物比文字更重要。
物件比文字更大。
图形元素随机分布。
中心太空、主次不清。
构图像模板。
画面像普通封面排版。

---

八、画幅比例与尺寸策略

请不要固定使用某一种画面比例。请根据「[目标字词]」的含义、视觉隐喻、构图张力和最佳展示效果，自动选择最适合的画幅比例。

画面比例必须服务于文字主题，而不是机械套用竖版海报。

请先判断这个词的空间倾向:

如果词义更像"凝聚、核心、封闭、稳定、图腾、权力、信仰、秩序"，优先考虑方形或接近方形比例。
如果词义更像"上升、坠落、崇高、压迫、孤立、高塔、深井、审判、精神高度"，优先考虑竖向比例。
如果词义更像"流动、扩张、远方、旅程、传播、自由、连接、时间线、边界消失"，优先考虑横向比例。
如果词义更像"史诗、文明、群体、宇宙、迁徙、巨大系统、宏观叙事"，优先考虑超宽比例。
如果词义更像"深渊、极端孤独、垂直坠落、悬崖、高塔、信仰凝视"，优先考虑超竖比例。
如果词义更像"声音、道路、河流、轨道、信息流、呼吸、风、长时间延展"，优先考虑横幅比例。

可选画幅包括但不限于:

1:1 方形画幅:
适合凝聚、符号化、图腾化、标志性强的词语。
例如:中心、控制、秩序、神、圆、核心、信仰、权力、文明。
方形画幅适合让文字成为稳定、集中、强识别的视觉符号。

4:5 或 3:4 竖版画幅:
适合具有纪念碑感、精神高度、压迫感、人物感、崇高感、仪式感的词语。
例如:孤独、道德、审判、欲望、文明、上升、坠落、时间、命运。
竖版画幅适合强调高度、垂直力量、空间压迫、精神凝视和海报感。

16:9 或 3:2 横版画幅:
适合扩张、流动、旅程、开放、叙事、距离、速度、风景感、系统感的词语。
例如:自由、远方、逃离、流动、迁徙、未来、连接、网络、边界、文明。
横版画幅适合表现空间延展、方向性、地平线、传播、移动和开放感。

21:9 超宽画幅:
适合宏大、史诗、文明、战争、迁徙、宇宙、深度、历史、系统、群体、巨大空间。
超宽比例适合营造强烈空间尺度、电影级横向叙事和宏观世界观。

9:16 超竖版画幅:
适合极端上升、坠落、深井、高塔、悬崖、压迫、信仰、崇高、孤独、深度。
超竖版适合表现强烈垂直运动、精神高度或深渊感。

3:1 或 4:1 横幅画幅:
适合速度、传播、长句、线性时间、道路、河流、轨道、信息流、呼吸、风、声音。
横幅适合表现线性延展和方向性。

请根据「[目标字词]」自动判断最适合的画幅比例，并让比例成为隐喻的一部分。

例如:

「自由」可以使用横版或超宽画幅，强调开放空间、扩张和边界消失。
「孤独」可以使用竖版或方形画幅，通过巨大留白和单一视觉中心制造孤立感。
「控制」可以使用方形或竖版画幅，强化秩序、框架、限制和压缩感。
「时间」可以使用横幅或横版画幅，表现线性流动、残影和叠印。
「深度」可以使用超竖版或方形画幅，表现向内、向下、层层嵌套的空间。
「文明」可以使用超宽或竖版画幅，表现宏大尺度、建筑秩序和历史沉积。
「欲望」可以使用竖版、方形或强裁切画幅，表现中心引力、拉扯和无法逃离。
「焦虑」可以使用压缩的方形、竖版或不稳定构图，表现空间被挤压和呼吸困难。

无论选择什么比例，都必须保证:

文字仍然是第一视觉主体。
文字足够大、足够清晰、足够突出。
画幅比例必须强化词义。
构图不能因为比例变化而松散。
辅助元素必须围绕文字建立隐喻系统。
画面必须具有完整的专业设计感。

如果不确定比例，请优先选择最能让文字变大、最能强化隐喻、最能形成视觉冲击的比例，而不是默认竖版。

---

九、色彩与光影

不要固定明亮或暗黑。请根据「[目标字词]」选择最有表现力的色彩和光影。

色彩可以明亮、低调、冷峻、温暖、强烈、柔和、极简、复杂，但必须高级，必须符合词义。

请避免廉价配色、脏乱色彩、无意义渐变、俗气霓虹、过度饱和、AI随机色。

可使用:

高对比黑白
强烈红黑
冷蓝银灰
象牙白与金色
米白与墨色
深绿与铜色
橙红与奶油白
紫黑与银白
灰白与荧光点缀
单色系加一个强烈点缀色
大面积纯色加局部高饱和色
高级渐变与精准色块

光影也应服务隐喻:

孤独可以用大留白和微弱光点。
欲望可以用暗部中的高光、镜面反射、红色引力点。
控制可以用冷静均匀光、精准阴影、框架投影。
焦虑可以用压迫阴影、错位投影、刺眼局部高光。
文明可以用庄重光束、碑铭感阴影、建筑光线。
时间可以用残影、褪色、叠印、旧纸光感。
自由可以用开阔光线、轻盈阴影、向外扩散的亮部。
深度可以用层层递进的暗部和明暗入口。

不要为了光影而光影。光影必须帮助文字更突出。

---

十、材质与图形语言

请根据词义选择合适的材质或平面语言。

可以是纯平面设计，也可以是轻微立体，也可以是材质化字体，但不能让材质压过文字结构。

可使用:

纸张质感
墨迹
金属
石材
玻璃
丝绸
液体
烟雾
灰尘
植物纤维
机械零件
数字网格
旧照片
印刷颗粒
撕纸边缘
透明层
发光线条
手工拼贴
雕塑质感
浮雕
压印
裂纹
镜面反射
投影
矢量图形
几何色块

材质必须服务于词义。例如:

"时间"适合纸张、褪色、叠印、风化、旧物。
"控制"适合金属、网格、透明框架、测量线。
"欲望"适合镜面、丝绸、液体、拉伸形态。
"孤独"适合雾、空白、玻璃、微弱颗粒。
"生命"适合纤维、透明叶脉、有机曲线。
"文明"适合石材、书页、碑铭、建筑尺度。
"焦虑"适合裂纹、错位线、重复阴影、压缩网格。
"自由"适合纸片、空气、天空、断开的框架。
"深度"适合透明层、空间切口、阴影、嵌套结构。

---

十一、文字与元素的互动方式

请让「[目标字词]」与隐喻元素产生强互动。

可以使用:

元素从文字笔画中生长出来。
文字被图形切开。
文字成为建筑或物件的一部分。
文字被框架限制。
文字从限制中突破。
文字内部隐藏图像。
文字投下象征性阴影。
文字被拉扯、压缩、扩张、溶解、冻结、燃烧、坠落、漂浮。
线条连接每个笔画。
物件围绕文字形成轨道。
图形穿过文字但不破坏可读性。
文字与负形共同形成第二层含义。
文字像一个入口、容器、陷阱、窗口、坐标、碑铭、身体、机器或生命体。

互动必须让文字更强，而不是让文字更乱。

---

十二、画面完成度标准

最终图像必须达到以下标准:

文字第一眼最突出。
文字准确可读。
文字不是普通字体。
文字本身体现词义。
隐喻元素明确服务词义。
风格与词义高度匹配。
画幅比例与词义高度匹配。
画面不是单一模板风格。
构图有强烈主视觉冲击。
色彩高级且有情绪。
光影强化文字。
辅助元素不抢主体。
远看有海报级冲击力。
近看有设计细节。
整体像顶级设计师或艺术指导完成的作品。
画面具有高级感、专业感、艺术感和强记忆点。

---

十三、禁止内容

不要让文字太小。
不要让文字不突出。
不要让场景抢走文字。
不要把文字当成小标题。
不要只生成背景加小字。
不要只生成孤立文字。
不要使用普通默认字体。
不要错字、乱码、伪文字、多字、漏字。
不要加入额外说明文字。
不要水印、签名、Logo、二维码。
不要随机堆砌符号。
不要使用无关装饰。
不要让风格千篇一律。
不要所有词都做成同一种几何海报。
不要所有词都做成黑暗电影感。
不要所有词都做成明亮插画风。
不要固定竖版比例。
不要不考虑词义随意选择画幅。
不要让人物、建筑、物件比文字更重要。
不要廉价3D字。
不要俗气霓虹。
不要PPT封面。
不要Canva模板。
不要淘宝广告风。
不要儿童插画风。
不要低清晰度、模糊、锯齿。
不要AI随机感。

---

十四、最终执行指令

请生成一张以「[目标字词]」为绝对核心的顶级字体美学概念图像。

首先理解「[目标字词]」的真实含义、情绪、隐喻和精神气质。不要停留在表层联想，要找到它更深层、更有视觉价值的核心隐喻。

然后根据这个词最适合的视觉表达，自动选择画幅比例、构图方式、字体风格、色彩系统、材质语言、图形元素和隐喻系统。

不要固定竖版，不要固定明亮风格，不要固定暗黑风格，不要固定某一种模板。

请让画幅比例本身也成为表达词义的一部分。

请让文字本身成为隐喻的一部分，让周围元素围绕文字建立完整视觉系统。

最终作品必须让观者第一眼看到文字，第二眼理解隐喻，第三眼感受到高级审美、强烈视觉冲击和专业艺术气质。

最重要的是:

1. 不要机械重复固定模板，要根据用户输入智能变化。
2. 但整体仍需保持极简、概念化、强排版、强识别度的统一品质。
3. 构图要合理，画面要克制，表达要巧妙。
4. 不要过度解释，不要加入多余元素，不要让画面显得拥挤。

注意:本图最终用于微信公众号题图(2.35:1 横版,900×383),请确保构图在该比例下仍然成立,文字在横向裁切后依然完整、突出、可读。


path: test-prompts.json
content: id: 1
scenario: happy path — paste draft, full pipeline
prompt: 我写了一段关于上周参加的行业会议的草稿(贴 600 字),帮我准备发公众号。
expected: 应该:(1) 创建 articles/2026-05-10-{slug}/ 目录;(2) 写 original.md 备份;(3) 轻润色到 article.md(改动<5%, 不加'笔者认为'/不删句尾'吧呢啊'/不加 emoji);(4) 用 AskUserQuestion 给 3 个标题候选(直白/故事/原文金句);(5) 50-80 字摘要不重复第一段;(6) 用 AskUserQuestion 问题图 4 选(已有/文字/AI/跳过);(7) 自动生成 illustration.png 不问;(8) 转 article.html (pandoc 优先);(9) 输出固定格式 publish.sh 指引。

id: 2
scenario: cover ratio + AI cost gate
prompt: 上一篇帮我用 AI 生成题图,字词用'三层'。
expected: 应该:(1) 用 gen-cover-ai.sh 调 gpt-image-2-skill;(2) 严格 2.45:1 (900×383) — SKILL.md 内当前 line 79/149 标 2.45 但 line 98 标 2.35, 矛盾;(3) 提醒用户每次约 $0.05-0.20 的成本(若 Codex 路径走 ChatGPT Plus 配额则免费);(4) 缺 OPENAI_API_KEY 和 ~/.codex/auth.json 时不应静默失败,要提示用户该配哪个;(5) 1536x1024 起步, sips 居中裁;(6) 重跑时不覆盖 cover-raw.png 或先备份。

id: 3
scenario: voice transcript with errors (光润色不重写 test)
prompt: 这是我用语音转出来的一段话,错字一堆,你看着改改:'今天我我去买菜，价钱很便宜，不过那个西红市好像不太新鲜...'
expected: 应该:(1) 修'我我'重复字、'西红市'→'西红柿'同音字;(2) 不删'今天'(line 263 anti-pattern);(3) 不加 emoji 不加'综上所述';(4) 段落切到 1-3 句;(5) 列 diff 给用户(改动 ≤3 处可不列, 但本例至少 2 处, 边缘);(6) 标点统一(中文全角逗号)。

Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)