Skill: aiworkskills/aws-wechat-article-images (version 1.0.23)

--- name: aws-wechat-article-images description: 公众号封面｜公众号配图｜公众号插图｜AI 生图 — 公众号 AI 封面与配图生成，按文章标题与内容自动匹配画风，一稿多方案，多风格预设可复用。面向公众号编辑、自媒体、品牌设计。触发词：「封面」「配图」「插图」「生成图片」「给文章加图」「做个封面」「文章插图」「配个图」。不写正文只发一组图请走 aws-wechat-sticker；需要多环节串联（写+审+排+配图+发）请走 aws-wechat-article-main。 homepage: https://aiworkskills.cn url: https://github.com/aiworkskills/wechat-article-skills metadata: openclaw: requires: env: - IMAGE_MODEL_API_KEY bins: - python3 primaryEnv: aws.env --- # 配图 **公众号封面 & 配图 AI 生成** —— 按文章内容自动匹配画风，一稿多方案，风格体系可复用。 > **套件说明** · 本 skill 属 `aws-wechat-article-*` 一条龙套件（共 9 个 slug，入口 `aws-wechat-article-main`）。跨 skill 的相对引用依赖同一 `skills/` 目录，建议一并 `clawhub install` 全套。源码：<https://github.com/aiworkskills/wechat-article-skills> ## 能力披露（Capabilities） 本 skill 调 `image_create.py` **调外部图像 API** 生成封面与正文配图。**会把图片提示词（可能含文章主题片段）发给用户配置的图像生成端点。** 具体行为： - **凭证读取**：`aws.env` 的 `IMAGE_MODEL_API_KEY` - **凭证外发**：该 key 以 `Authorization: Bearer` 头发送到 `image_model.base_url` 指定端点（常见为 DALL-E、gpt-image 兼容 `/v1/images/generations`，或多模态模型 `/v1/chat/completions`，具体由用户配置） - **内容外发**：每张图片的 prompt（文本）作为 JSON POST body 发送；prompt 内容来自本篇 `imgs/prompts/*.md`（可能包含文章标题、章节摘要） - **下图 SSRF 防御**：若 API 响应返回图片 URL（而非 base64），脚本**仅允许下载 http/https 公网地址**；内网 / 环回 / 链路本地 / 保留地址全部拒绝（防止恶意或被劫持的模型端点把脚本当作 SSRF 跳板） - **文件读**：仓库内 `.aws-article/config.yaml`、本篇 `article.yaml`、`article.md`、`imgs/prompts/*.md`、`.aws-article/products/{产品名}/images/*`（业务配图库，本篇涉及用户业务时优先复用） - **文件写**：本篇 `imgs/*.{png,webp}`、可选 `img_analysis.md` - **shell**：仅 `python3 {baseDir}/scripts/image_create.py`、`user_image_prepare.py` **建议**：用专用 key（最低权限、独立计费），避免使用 account 级 master key。 ## 配套 skill（informational） 本 skill 是 `aws-wechat-article-*` 一条龙公众号套件的**配图环节**（入口 `aws-wechat-article-main`）。工作流中的若干步骤会读取同级 `../aws-wechat-article-main/references/*.md` 等共享文档（首次引导、env/config 示例、articlescreening schema 等）。 - **套件完整装齐到同一 `skills/` 根目录**时，跨 skill 引用都能读到。 - **单独安装本 skill** 时，跨 skill 引用的步骤会在读取阶段遇到 `file not found`；本 skill 内的生图脚本仍可用。 完整 9 slug 清单见 [源码仓库](https://github.com/aiworkskills/wechat-article-skills)。 ## 路由 完整长文从选题到发布 → [aws-wechat-article-main](../aws-wechat-article-main/SKILL.md)；图片消息/九宫格等多图推送 → [aws-wechat-sticker](../aws-wechat-sticker/SKILL.md)。 读取文章中的配图标记，按 Type × Style 体系生成图片。专注于**长文配图**，贴图请用 sticker。 ## 脚本目录 **Agent 执行**：确定本 SKILL.md 所在目录为 `{baseDir}`。 | 脚本 | 用途 | |------|------| | `scripts/image_create.py` | 专用生图 API：读 **`.aws-article/config.yaml`** 的 **`image_model`** + 仓库根 **`aws.env`** 的 **`IMAGE_MODEL_API_KEY`**| | `scripts/user_image_prepare.py` | 用户供图模式：确保本篇 `imgs/` 存在并生成 `img_analysis.md` 模板（封面仅 1 张） | ## 配置检查 ⛔ 任何操作执行前，**必须**按 **[首次引导](../aws-wechat-article-main/references/first-time-setup.md)** 执行其中的 **「检测顺序」**。检测通过后才能进行以下操作（或用户明确书面确认「本次不检查」）： 从选题到发布的**前置规则**见 [aws-wechat-article-main/SKILL.md](../aws-wechat-article-main/SKILL.md)；本 skill 只描述配图步骤。 **图片模型**：**`image_model`**（`provider`、`base_url`、`model`、`default_size`、`default_quality` 等）在 **`config.yaml`**；**`IMAGE_MODEL_API_KEY`** 在 **`aws.env`**。键名对照 **`{baseDir}/../aws-wechat-article-main/references/env.example.yaml`**。 **`base_url` 须为完整端点路径**，脚本根据路径判断调用模式： - `https://xxx.com/v1/images/generations` — DALL-E / gpt-image 等 - `https://xxx.com/v1/chat/completions` — Gemini 等多模态模型（通过中转站生图） **交互约定**：可提示用户上述项是否已填；**一条龙**下通常已通过 **`validate_env.py`**。须遵守 main 的**智能体行为约束**——未通过环境校验且未获用户明确「本次例外」时，不得假装已走专用生图 API。 ## 封面风格 + 正文配图 - **封面风格**：独立预设体系，见 [references/cover-styles/](references/cover-styles/)。每个预设 `.md` 自包含视觉关键词。 - **正文配图**：Type（画面构成）决定"画什么"，Style（视觉风格）由 Agent 根据 tone/category 内部选择。Type 列表与 prompt 模板见 [references/image-styles/](references/image-styles/) 目录。 ### 封面 vs 正文（资源策略）⛔ | 类型 | 要求 | |------|------| | **封面** | **必须**通过 **`image_create.py`** 生成（`generate` 或 `batch` 读 `imgs/prompts/*.md`），产出并保存为文章目录下的 **`cover.png`**（或 `cover.jpg` / `cover.jpeg` / `cover.webp`）。**禁止**将 `.aws-article/products/{产品名}/images/`（或其它素材库文件）**直接复制**为 `cover.*` 充当封面。**例外**：用户**明确上传**封面文件并声明「封面只用这一张」时，可跳过脚本，须在 **`img_analysis.md`** 与审稿记录中注明「用户指定封面」。 | | **正文** | **优先使用业务配图库**：`.aws-article/products/{相关产品}/images/`（先读同名 `.md` 再复制到本篇 `imgs/` 或引用路径），见下文「正文配图来源优先级」。缺图时再走 **`image_create.py`** 或 Agent 降级生图。 | > 说明：全局 `config.yaml` 的 **`image_source: user`** 表示「正文以用户/素材引用为主」；**不豁免**上述「封面须脚本生成」规则，除非用户同时提供了封面文件并声明仅用该封面。 ## 工作流 ``` 配图进度： - [ ] 第1步：环境检查 + 本篇约束与文章 - [ ] 第2步：解析配图标记 - [ ] 第3步：确定风格 - [ ] 第4步：生成配图方案 - [ ] 第5步：展示方案并等待确认 ⛔ - [ ] 第6步：生成图片（**脚本失败时**见同节「调用失败」分支，勿静默吞掉报错） - [ ] 第7步：插入文章 ``` ### 正文配图来源优先级（Agent）⛔ **仅适用于正文插图**（不含封面；封面见上文「封面 vs 正文」）。**在**为正文 `placeholder` 调用 `image_create.py`、写入 `imgs/prompts/` **之前**，须先判断是否可用**本地业务配图库**，避免**业务相关文章**（教程 / 产品介绍 / 案例 / 自家界面截图）「有现成业务配图却重新生成」： 1. **仓库业务配图库**：若本篇涉及用户业务，先 `ls .aws-article/products/`，进入相关产品的 **`images/`** 子目录，列出并阅读 **同名 `.md`**（含路径与画面说明），按主题匹配后，在 `article.md` 中直接引用对应 **`.png` / `.webp`**（或复制到本篇 `imgs/` 再引用）。**与正文严格相关才用**，避免硬凑。 2. **用户上传 / 本篇 `image_source: user`**：用户提供的图或上述引用策略，走「用户供图模式」与 `img_analysis.md`（正文部分）。 3. **仍缺图或须原创插画**：再进入 **Type × Style**、`imgs/prompts/` 与 **`image_create.py`**（或 Agent 降级生图）。 > 说明：业务配图库属「仓库内业务资源」，**不必**等用户手动上传才查；与「用户供图模式」并列，而非仅附属于后者。 ### 第1步：环境检查 + 本篇约束与文章 - **全局**：读 **`.aws-article/config.yaml`** — `cover_aspect`、`cover_style`、`image_density`、`caption_style`、`multi_image_count`、`tone` 等以之为准（完整字段见 [articlescreening-schema.md](../aws-wechat-article-main/references/articlescreening-schema.md) 与 **`config.example.yaml`**）。 - **本篇**：若同目录有 **`article.yaml`**，读取 **`default_cover_image_style`**、**`default_article_image_style`**（应为单元素列表，代表本篇已选预设）及 `cover_image` 等字段。 - 读取 **`article.md`**（或当前流程规定的正文来源）。 - 当 `image_source: user`（全局或本篇）时，进入「用户供图模式」：先创建本篇 `imgs/` 并生成/更新 `img_analysis.md`，记录每张图的内容分析、建议章节与推荐用途。 ### 第2步：解析配图标记 提取所有 `![类型：描述](placeholder)`。`实证` 类型提示用户提供素材或从 `.aws-article/products/{相关产品}/images/` 搜索（业务配图库）。 ### 用户供图模式（新增分支） 当用户上传图片并指定主题时，按以下顺序执行： 1. 立即确保 `{article_dir}/imgs/` 存在，并将用户图片放入该目录。 2. 生成/维护 `{article_dir}/img_analysis.md`（每图至少包含：文件名、图片内容、建议章节、推荐用途、图注建议）。 3. **硬性约束**：`img_analysis.md` 中“推荐用途：封面”**必须且只能出现 1 次**；其余图片用途应为“正文”。 4. 同步更新本篇 `article.yaml`：`image_source: user`（从模型生图切换到用户供图状态）。 - 字段取值只允许 `generated` / `user`。 5. 写稿阶段直接使用用户图片路径（如 `imgs/淘米.png`），**不再使用 placeholder**。 **顺序说明**：`imgs/` 落图 → 分析并写好 `img_analysis.md` → 再跑 `write.py`；写稿时以 `img_analysis.md` 为准，把图片插到与内容匹配的章节位置。 ### 发布后换图重发（新增分支） 当用户明确说「这篇文章配图不满意，换成我上传的新图并重新发草稿箱」时，按以下流程： 1. 用户指定目标文章目录（`drafts/YYYYMMDD-slug/`）。 2. 将新图放入该目录 `imgs/`，并更新 `img_analysis.md`（仍需满足“封面仅 1 张”）。 - 同步把本篇 `article.yaml.image_source` 更新为 `user`。 3. 按 `img_analysis.md` 重新映射图片到 `article.md` 对应章节（允许重排章节以匹配图序）。 4. 运行 `format.py` 重新生成 `article.html`（不要只改旧 html 局部）。 5. 进入终审：确认 `article.md` / `article.html` 无 `placeholder`，且引用图片文件均存在。 6. 回到发布步骤执行 `publish.py full`（`publish_method: draft` 时写入草稿箱）。 **可用素材库**（与上文「配图来源优先级」一致）： - `.aws-article/products/{产品名}/images/`：业务配图库（产品截图、品牌素材等）；本篇涉及用户业务时**优先读同名 `.md` 再选图**。若已用业务配图满足正文，可不再走生图 API。 ### 第3步：确定风格 封面与正文配图**分别**确定风格，走各自的预设目录。 #### 封面风格 **预设发现**：Agent 扫描两个目录合并可用封面预设列表： 1. **内置**：`{baseDir}/references/cover-styles/`（随 skill 安装） 2. **用户自定义**：`.aws-article/presets/cover-styles/`（用户创建或预设包导入） **加载优先级**： 1. 用户当次指定（如「封面要简约风」） 2. **本篇 `article.yaml.default_cover_image_style`**（单元素列表）→ 从内置或 **`.aws-article/presets/cover-styles/<名>.md`** 加载（用户文件同名优先于内置） 3. **fallback**：根据 `tone` / `article_category` 从可用封面预设中自动推荐（规则见 [auto-selection.md](references/image-styles/auto-selection.md)） 每个封面预设 `.md` 自包含视觉关键词（`Prompt 要点`），无须引用外部 Style 维度。Schema 见 [cover-styles/README.md](references/cover-styles/README.md)。 #### 正文配图风格 **预设发现**：Agent 扫描 `.aws-article/presets/image-styles/` 获取可用正文配图预设。 **加载优先级**： 1. 用户当次指定（如「正文要扁平插画」） 2. **本篇 `article.yaml.default_article_image_style`**（单元素列表）→ 加载 **`.aws-article/presets/image-styles/<名>.md`** 3. **fallback**：根据正文内容信号与 `tone` 自动推荐 Type 和视觉风格（规则见 [auto-selection.md](references/image-styles/auto-selection.md)），视觉风格为 Agent 内部决策 ### 第4步：生成配图方案 为每张图生成方案（类型、风格、prompt 要点）。 **封面 prompt frontmatter 必须包含 `aspect`**：从 `config.yaml` 的 `cover_aspect` 读取（如 `2.35:1`），写入 YAML frontmatter。`image_create.py` 据此转换为实际像素尺寸；**缺少 aspect 会导致 fallback 到 1:1**。 **图片内文字**：画面中出现的文字必须为中文。在 prompt 里**直接写出要显示的中文文案**（如「传统对话AI」「OpenClaw」），禁止只写 “labels in Chinese” 或 “Chinese or English OK”，否则模型会生成英文。 Prompt 构建：[references/image-styles/prompt-construction.md](references/image-styles/prompt-construction.md) ### 第5步：展示方案并等待确认 ⛔ ### 第6步：生成图片 **封面**：见「封面 vs 正文」— **默认必须先**写好 **`imgs/prompts/`** 中封面 prompt（含 `aspect` 与 `config.yaml` 的 **`cover_aspect`** 一致），再执行 **`image_create.py generate … -o ../cover.png`**（或等价输出路径）。 **生成方式（优先级，正文）**： 0. **已在「正文配图来源优先级」中用尽素材库 / 用户图**：本节不再对**该图位**重复生图（封面仍须单独按上款处理）。 1. **缺图时优先：调用专用生图 API**（`scripts/image_create.py`）— 依赖 **`config.yaml` 的 `image_model` + `aws.env` 的 `IMAGE_MODEL_API_KEY`** 2. **自动降级：模型未配置**（退出码 2、stderr 含 `[NO_MODEL]`）且当前 Agent 支持图片生成、并已获用户明确同意代生图 → Agent 读取 `imgs/prompts/*.md` 中的 prompt + frontmatter（size/quality），用自身多模态能力按**相同 prompt** 生图 → 告知用户 `ℹ️ 图片模型未配置，本次由当前对话模型直接生图（使用相同配图方案）` → 生成后**正常执行第 7 步**（插入文章） 3. **故障降级**（退出码 1）→ 按本节下方「调用失败」表格分类处理 4. **用户供图：跳过生图** — 当 `image_source=user` 或用户明确”使用我上传的图片”时，不调用 `image_create.py`，改为”读图分析 + 写稿引用 + 重排版” **必须告知用户当前使用的方式**： - 已配置且调用脚本 → `ℹ️ 使用 image_create.py 调用专用生图模型（{model}）` - Agent 降级生图（退出码 2）→ `ℹ️ 图片模型未配置，本次由当前对话模型直接生图（使用相同配图方案）` - 故障降级 / 仅 prompts → `ℹ️ 本次未走 image_create.py（原因：…）` **⛔ 故障降级（退出码 1）时的终点**：只做到第 4 步（或第 5 步）。产出 `imgs/prompts/*.md` 与方案；**不执行**「替换 article 中的 placeholder」或「修复 HTML」。若 `imgs/README.md` 尚不存在或需补充当前方案的说明，可创建/更新（如何配置 **`aws.env` / `config.yaml`**、如何跑 `image_create.py batch`、如何在 `article.html` 中替换）；若已存在且已涵盖当前方案，**不必重写**。 **注意**：退出码 2（模型未配置）且 Agent 支持图片生成、并已获用户明确同意代生图时，**不受上述终点限制**——Agent 降级生图后继续执行第 7 步。 **调用专用 API 时**（在**仓库根**执行，`{baseDir}` 按上表解析；路径按本篇 `imgs/` 调整）： ```bash python {baseDir}/scripts/image_create.py batch drafts/YYYYMMDD-slug/imgs/prompts/ -o drafts/YYYYMMDD-slug/imgs/ ``` 单张：`python {baseDir}/scripts/image_create.py generate imgs/prompts/01-cover.md -o imgs/01-cover.png` 连通性自检：`python {baseDir}/scripts/image_create.py test` 图片规格：[references/specs.md](references/specs.md) #### `image_create.py` 调用失败时（智能体必选分支） 只要执行了 `image_create.py` 且**非零退出或 stderr 有 API/网络错误**，就必须走本节，**不得**只说「生图失败」而不分类、不摘要报错。 运行脚本后**须把终端 stderr 中的具体报错摘要给用户**（含 `❌`、HTTP 状态码、`【配置/认证】`、`网络错误（可重试）`、`[NO_MODEL]` 等关键行），勿只说「失败」。 | 类型 | 判断线索 | 智能体动作 | |------|----------|------------| | **未配置** | 退出码 2、`[NO_MODEL]` | Agent 支持图片生成且用户明确同意代生图 → 读取 `imgs/prompts/*.md` 中的 prompt + frontmatter（size/quality），用自身多模态能力按相同 prompt 生图并继续第 7 步。Agent 不支持图片生成，或 Agent 代生图失败 → 明确告知“我当前不能完成生图”，给用户二选一：**配置图片模型后重试**，或**本篇不配图继续**（保留 prompts 并在结果中标注无配图）。 | | **网络类** | `URLError`、`网络错误（可重试）`、超时、临时 502/503 | **必须自动再试 1 次**（可短暂等待后重跑同一命令）。**第二次仍为网络类** → 可降级为 **Agent 多模态生图** 或仅保留 prompts；**须明确告知**用户本次未走专用 API。 | | **配置/凭证类** | 401/403、图片模型配置不完整、`【配置/认证】` | **不要**静默降级。**列出须检查项**（**`config.yaml` 的 `image_model`**、**`aws.env` 的 `IMAGE_MODEL_API_KEY`**、端点、权限），请用户改正后重跑。用户**明确打字**接受本次仅用 Agent/仅 prompts 时，再按 main「本次例外」处理。 | | **业务/参数类** | `【请求参数】`、400、返回体提示 model/size 不支持 | 将响应摘要给用户；可改 **`config.yaml` 或 env** 中的 model/尺寸后再试；仍失败则与用户商定是否 Agent 生图。 | **禁止**：配置明显错误时静默改用 Agent 却不说明；网络降级后不告知「本次未走专用生图」。 ### 第7步：插入文章 仅当**已生成图片**时执行：替换 placeholder 为实际图片路径，输出到 `imgs/`。 **封面排除**：封面图（`![封面：...]`）**仅用于微信文章封面上传**，**禁止**作为 `<img>` 嵌入 HTML 正文。替换 placeholder 时**跳过封面标记行**（或直接删除该行），封面图单独复制到文章根目录 `cover.{ext}`。`publish.py` 也支持从 `imgs/` 目录自动发现封面图（`cover.*` 或 `*-cover.*`）。 **修复 HTML 的触发条件**：仅当在 `article.html` 中**确实存在** `href="placeholder"` 或 placeholder 被渲染成可点击链接时，才将误转的 `<a>` 改为 `<img>` 或占位说明；**不要**默认每次都执行「修复流程图占位」或「修复 HTML」。 ## 过程文件 | 读取 | 产出 | |------|------| | **`article.md`**、**`.aws-article/config.yaml`**、本篇可选 **`article.yaml`** 中的标记与配图约束 | `imgs/`（outline + prompts + 图片；未走 API 时为 prompts + 可选 imgs/README.md） |

path: references/cover-styles/README.md
content: # 封面风格预设

本目录下的 `.md` 文件为**封面风格预设**（内置）。用户自定义预设放在 `.aws-article/presets/cover-styles/` 下。

## 加载规则

生成封面时按 **`article.yaml` > `custom_cover_image_style` > `default_cover_image_style`** 合并后的预设名加载对应 `.md`（`custom_*` 非空时覆盖同名 `default_*`；须收窄为单元素列表后再执行配图）。

**预设发现**：Agent 运行时扫描两个目录合并可用列表：

1. **内置**：`skills/aws-wechat-article-images/references/cover-styles/`（随 skill 安装）
2. **用户自定义**：`.aws-article/presets/cover-styles/`（用户创建或由 `.aws` 预设包导入）

用户自定义同名文件优先于内置。

## Schema

每个 `.md` 文件描述一种封面视觉风格：

```markdown
# 风格名

## 描述
[1-2 句视觉风格描述]

## 适用场景
[适合什么类型的文章/账号]

## Prompt 要点
- [视觉关键词，直接用于生图 prompt]
- [构图/色彩/氛围等具体指导]
- 画面内文字必须为中文，在 prompt 中直接写出要显示的中文文案
```

- 文件名即预设名（不含后缀），如 `简约.md` → 预设名 `简约`。
- `Prompt 要点` 部分会被 Agent 直接嵌入封面 prompt 的「风格」字段。
- 每个预设自包含视觉风格描述，无须引用外部 Style 维度。

## 示例

见同目录下的 `.example.md` 文件。复制到 `.aws-article/presets/cover-styles/` 并重命名为 `.md` 后按需修改。


path: references/cover-styles/大字报.example.md
content: # 大字报

## 描述

大胆醒目的排印设计，超大字号占据画面主体，强对比色块，海报感十足。适合观点鲜明、需要吸引眼球的文章。

## 适用场景

观点文章、评论、热点话题、犀利文风。适合个人 IP 或自媒体调性的账号。

## Prompt 要点

- bold typography-driven layout, oversized Chinese characters as main visual
- high contrast color blocks, 2-3 strong colors, no subtle gradients
- poster-like composition, graphic and punchy
- minimal imagery, text IS the visual; background supports readability
- 画面内文字必须为中文，在 prompt 中直接写出要显示的中文文案


path: references/cover-styles/插画.example.md
content: # 插画

## 描述

扁平化插画风格，色块分明，几何化人物或物品，清新明快的配色。兼顾趣味性与信息传达。

## 适用场景

教程、科普、知识分享、生活方式类文章。适合轻松或专业调性的账号。

## Prompt 要点

- flat illustration style, vector-like shapes, solid color blocks, minimal gradients
- stylized characters or objects with geometric simplification
- bright and fresh color palette, 2-4 main colors
- clear visual hierarchy, one main scene or concept
- 画面内文字必须为中文，在 prompt 中直接写出要显示的中文文案


path: references/cover-styles/科技风.example.md
content: # 科技风

## 描述

深色背景搭配科技感光效，数据流、电路纹理、HUD 元素，营造前沿技术氛围。

## 适用场景

AI、前沿科技、系统设计、技术深度文章。适合科技类或极客调性的账号。

## Prompt 要点

- dark background (deep blue, black, dark gray), neon or electric accent colors
- tech elements: circuit patterns, data streams, holographic overlays, grid lines
- glowing edges, light trails, subtle particle effects
- futuristic and sleek, high contrast between dark base and bright accents
- 画面内文字必须为中文，在 prompt 中直接写出要显示的中文文案


path: references/cover-styles/简约.example.md
content: # 简约

## 描述

干净利落的极简设计，大面积留白，单一焦点元素，低饱和度配色。适合传递专业、可信赖的视觉印象。

## 适用场景

科技、商业、知识分享、专业分析类文章。适合正式或专业调性的账号。

## Prompt 要点

- minimal design, clean composition, ample whitespace, single focal point
- muted or monochromatic color palette, subtle gradients allowed
- geometric or abstract shapes preferred over literal illustrations
- no clutter, no decorative elements, breathing space around subject
- 画面内文字必须为中文，在 prompt 中直接写出要显示的中文文案


path: references/image-styles/auto-selection.md
content: # 自动推荐规则

当用户未指定风格时，根据文章内容自动推荐。

> 本文件主要用于**正文配图**的 Type 和 Style 自动推荐。封面风格的 fallback 见末尾「封面风格 fallback」节。

## 按文章调性（正文配图）

| 调性（config `tone`） | 推荐风格 |
|----------------------|---------|
| 正式、专业 | 扁平矢量、蓝图、商务 |
| 轻松、幽默 | 手绘、温暖、活泼 |
| 犀利 | 海报、极简 |

## 按文章内容信号

| 内容信号 | 推荐 Type | 推荐 Style |
|---------|-----------|-----------|
| 抽象概念、原理、隐喻 | concept | 扁平矢量、简约线条、手绘 |
| 教程、步骤、操作指南 | process | 扁平矢量、简约线条 |
| 知识框架、原理讲解、课程 | whiteboard | 手绘、简约线条 |
| 数据、统计、趋势、报告 | data-viz | 扁平矢量、商务 |
| 对比、评测、方案选择 | comparison | 扁平矢量、商务 |
| 架构、系统、模型、体系 | architecture | 蓝图、扁平矢量 |
| 知识全景、关系梳理、概览 | mindmap | 扁平矢量、简约线条 |
| 历程、里程碑、路线图 | timeline | 简约线条、商务 |
| Tips、要点列表、注意事项 | checklist | 扁平矢量、温暖 |
| 金句、核心观点、名言 | quote-card | 温暖、海报、极简 |
| 使用场景、产品展示、代入感 | scene | 温暖、水彩、手绘 |
| 故事、情感、散文、视觉呼吸 | atmosphere | 温暖、水彩、海报 |

## 按 config `article_category`（正文配图）

| 账号类型 | 默认风格基调 |
|---------|------------|
| 科技 | 蓝图 / 扁平矢量 |
| 职场 | 商务 / 简约线条 |
| 情感 | 温暖 / 水彩 |
| 教育 | 扁平矢量 / 手绘 |
| 品牌号 | 按品牌调性 |
| 个人IP | 温暖 / 手绘 |

## 配图密度

按 config `image_density`：

| 配置值 | 规则 |
|--------|------|
| 每节一图 | 每个 H2 小标题后一张 |
| 少图 | 仅封面 + 1-2 张关键配图 |
| 多图 | 每 2-3 段一张 |

writing 阶段已按此密度插入标记，images 阶段按标记执行即可。

## 封面风格 fallback

当 **`article.yaml` > `custom_cover_image_style` > `default_cover_image_style`** 合并后**无有效单选预设**（空列表或未收窄为单元素）时，Agent 从可用封面预设（扫描内置 + **`.aws-article/presets/cover-styles/`**）中按以下规则推荐：

| 调性 / 类型 | 推荐封面预设 |
|------------|------------|
| 科技、专业 | 科技风、简约 |
| 轻松、幽默 | 插画、漫画 |
| 犀利、观点 | 大字报 |
| 正式、商业 | 简约、品牌模板 |
| 通用 / 无明确信号 | 简约 |

注：推荐的预设名须在可用列表中存在。若推荐的预设不存在，从已有预设中择一最接近的。


path: references/image-styles/prompt-construction.md
content: # Prompt 构建指南

## 图片内文字语言（必守）

**公众号配图画面中出现的所有文字必须为中文。**

- 在 prompt 里**直接写出要显示的中文文案**（例如：左侧「传统对话AI」、右侧「OpenClaw」、步骤「立项」「开发」「上线」）。
- **禁止**只写 "labels in Chinese" 或 "Chinese or English OK" 等元描述——多数模型会默认生成英文。
- Prompt 本身可中英混排（描述构图用英文亦可），但「会出现在图上的字」必须用中文写出。

## 通用规则

所有 prompt 必须包含：

1. **布局结构**：描述构图、区域划分、视觉流向
2. **具体内容**：使用文章中的实际数据、术语、关键词（不要泛泛而谈）
3. **视觉关系**：元素之间如何连接、对比、层次
4. **语义颜色**：基于含义选色（红=警告、绿=增长、蓝=科技）
5. **风格特征**：线条处理、纹理、氛围
6. **比例**：封面按 config `cover_aspect`，正文配图 16:9 或 4:3

## 通用构图要求

所有 prompt 默认附加：

```
构图要求：
- 干净简洁，不堆砌元素
- 充足留白，主体元素呼吸感
- 纯色或轻微渐变背景，不要复杂纹理
- 主视觉居中或按内容需要布局
- 突出核心信息
```

## 人物表现

如需画人物：

```
人物表现：简化风格的人物剪影或符号化表达，不要写实人脸。
通过姿态和简单手势传达情绪。
```

## 文字处理

如画面中需要文字：

```
文字要求：大而醒目，手写风字体优先，仅保留核心关键词。所有图中文字必须为中文；在 prompt 中写出要显示的中文原文（如「传统对话AI」「OpenClaw」），不要写 "label in Chinese"。
```

---

## Type 专用模板

### concept 概念讲解

```
[标题] - 概念可视化

核心概念：[要解释的抽象概念]
视觉隐喻：[映射为什么具体事物，如"技术债"→堆积的砖块]

布局：[居中/对称/层级]
主体：[隐喻场景的核心画面]
辅助元素：[标注、箭头、小图标]

配色：[语义配色说明]
风格：[选定的风格特征]
比例：[比例]
```

### process 流程步骤

```
[标题] - 流程可视化

流向：[从左到右/从上到下]
步骤数：[N]

步骤：
1. [步骤名] → [简要说明]
2. [步骤名] → [简要说明]
3. [步骤名] → [简要说明]

连接方式：[箭头/线条/渐变过渡]
高亮：[哪个步骤需要突出]

风格：[选定的风格特征]
比例：[比例]
```

### whiteboard 板书白板

```
[标题] - 板书白板风

背景：白色或浅米色白板
笔触：手写体 + 马克笔风格

知识要点：
- [要点1]：[简要说明]
- [要点2]：[简要说明]
- [要点3]：[简要说明]

辅助：[箭头、圈注、下划线、简笔画]
配色：[马克笔配色，2-3 种主色]
比例：[比例]
```

### data-viz 数据可视化

```
[标题] - 数据可视化

图表类型：[柱状图/折线图/饼图/面积图]

数据标签：
- [具体数据点1：实际数字和术语]
- [具体数据点2：实际数字和术语]
- [具体数据点3：实际数字和术语]

布局：[网格/放射/层级]
区域：
- 顶部：标题区
- 中部主区域：[核心数据/图表]
- 底部：总结/来源

配色：[语义配色说明]
风格：[选定的风格特征]
比例：[比例]
```

### comparison 对比说明

```
[标题] - 对比可视化

布局：[左右分栏/上下分栏]

左侧/A项：
- 名称：[A]
- 特点：[关键差异点]

右侧/B项：
- 名称：[B]
- 特点：[关键差异点]

对比维度：[列出 3-5 个对比维度]
倾向：[中立/偏向某一方]

风格：[选定的风格特征]
比例：[比例]
```

### architecture 架构图

```
[标题] - 架构/模型可视化

结构：[层级/环形/矩阵/树状]

层级/模块：
- [顶层/核心]：[名称和说明]
- [第二层]：[名称和说明]
- [第三层]：[名称和说明]

连接关系：[包含/依赖/双向/单向]

风格：[选定的风格特征]
比例：[比例]
```

### mindmap 思维导图

```
[标题] - 思维导图

中心主题：[核心主题词]

一级分支：
- [分支1]：[关键词]
- [分支2]：[关键词]
- [分支3]：[关键词]

二级分支（可选）：
- [分支1] → [子项1]、[子项2]
- [分支2] → [子项1]、[子项2]

布局：[放射状/右侧展开/上下对称]
配色：每条主分支一个色系
风格：[选定的风格特征]
比例：[比例]
```

### timeline 时间线

```
[标题] - 时间线

方向：[横向/纵向]
节点数：[N]

节点：
1. [时间点]：[事件/里程碑]
2. [时间点]：[事件/里程碑]
3. [时间点]：[事件/里程碑]

高亮：[哪个节点需要突出]
连接线：[实线/虚线/渐变]
配色：[时间推进用渐变色]
风格：[选定的风格特征]
比例：[比例，通常 16:9 或 4:3]
```

### checklist 清单图

```
[标题] - 清单图

条目数：[N]

清单项：
- [✓/✗] [要点1]：[一句话说明]
- [✓/✗] [要点2]：[一句话说明]
- [✓/✗] [要点3]：[一句话说明]

每项配：[图标/编号/勾选框]
布局：[单列/双列/卡片网格]
配色：[语义配色说明]
风格：[选定的风格特征]
比例：[比例]
```

### quote-card 金句卡片

```
[标题] - 金句卡片

金句：「[完整中文金句]」
出处：[作者/来源]（可选）

布局：文字居中，大字号
装饰：[引号装饰/底纹/边框]
背景：[纯色/轻渐变/纹理]
配色：[与金句情绪匹配]
风格：[选定的风格特征]
比例：[比例，通常 1:1 或 4:3]
```

### scene 场景还原

```
[标题] - 场景还原

场景：[描述具体使用/生活场景]
主体：[人物动作或产品使用画面]
环境：[场景环境细节]
视角：[第一人称/俯视/平视]

情绪：[代入感/真实感/日常感]
色调：[暖色/冷色/自然色]
风格：[选定的风格特征]
比例：[比例]
```

### atmosphere 氛围烘托

```
[标题] - 场景氛围

场景：[描述画面场景]
情绪：[要传达的情感]
主体：[画面中心元素]
色调：[暖色/冷色/具体色彩倾向]
光线：[光源方向和质感]

风格：[选定的风格特征]
比例：[比例]
```

### 封面

封面 prompt 的「风格」关键词直接来自封面预设 `.md` 文件的「Prompt 要点」部分（见 [cover-styles/](../cover-styles/)），无须引用 Style 维度。

**YAML frontmatter 必须包含 `aspect`**：从 `config.yaml` 的 `cover_aspect` 读取（如 `2.35:1`），写入 frontmatter，`image_create.py` 据此转换为实际尺寸。缺少 frontmatter 的 aspect 会导致 fallback 到 1:1。

```yaml
---
aspect: "2.35:1"   # ← 必须：取自 config cover_aspect
quality: standard
---
```

```
[文章标题] - 封面图

核心意象：[从标题提取的抽象视觉概念]
情绪：[文章整体调性]
色调：[主色和辅色]

要求：
- 不包含文字（标题会单独叠加）
- 画面简洁有焦点
- 适合作为公众号封面缩略图（小尺寸也清晰）

风格：[从封面预设 .md 的 Prompt 要点加载]
```

---

## 高级布局（适用于复杂信息可视化）

在标记描述中指定布局类型：`![data-viz-漏斗：...]`、`![data-viz-冰山：...]`。

**布局类型一览**：

| 布局 | 适用场景 | Prompt 要点 |
|------|---------|-------------|
| `九宫格/bento` | 多主题概览 | 3×3 网格，每格一个主题，统一色调 |
| `漏斗/funnel` | 转化、筛选 | 上宽下窄，每层标注数据和标签 |
| `冰山/iceberg` | 表象 vs 本质 | 水面上下分区，上方简单下方复杂 |
| `金字塔/pyramid` | 层级、优先级 | 从底到顶，每层标注 |
| `环形/circular` | 循环流程 | 顺时针箭头连接的环形节点 |
| `矩阵/matrix` | 多维度对比 | 2×2 或 N×N 象限，轴标签 |
| `树状/tree` | 分类、层级 | 根节点→分支→叶节点 |
| `仪表盘/dashboard` | 关键指标 | 数字卡片 + 趋势图 + 状态灯 |
| `路线图/roadmap` | 规划、里程碑 | 蜿蜒路径 + 节点标注 |

**九宫格模板**：

```
[标题] - 九宫格信息图

布局：3×3 网格（或 2×3、2×4）

格子内容：
| [主题1] | [主题2] | [主题3] |
| [主题4] | [主题5] | [主题6] |
| [主题7] | [主题8] | [主题9] |

每格包含：图标 + 标题 + 一句话说明
统一风格：[圆角卡片/方格/无边框]
配色：[语义配色说明]
风格：[选定的风格特征]
比例：[比例，通常 1:1 或 4:3]
```

**漏斗模板**：

```
[标题] - 漏斗图

层数：[N]
方向：从上到下

各层（从宽到窄）：
1. [层名]：[数据/标签]（100%）
2. [层名]：[数据/标签]（60%）
3. [层名]：[数据/标签]（30%）
4. [层名]：[数据/标签]（10%）

配色：渐变色，从顶到底逐渐加深
风格：[选定的风格特征]
比例：[比例，通常 3:4 或 9:16]
```

**冰山模板**：

```
[标题] - 冰山图

水面以上（表象/可见）：
- [可见现象1]
- [可见现象2]

水面以下（本质/隐藏）：
- [隐藏原因1]
- [隐藏原因2]
- [深层逻辑]

水面线：明确标注
配色：水面上明亮，水面下深色
风格：[选定的风格特征]
比例：[比例，通常 3:4]
```

---

## 关键原则

- **补充而非重复**：文字讲道理，图给感觉；文字列数据，图给直觉
- **抽象优于具象**：「AI 赋能」→ 光线连接感 ✅，不要画机器人 ❌
- **情感对齐**：严肃段落配冷色调，轻松段落配暖色明快风
- **一图一个焦点**：不要塞太多元素
- **用文章中的真实数据**：信息图里要放实际数字和术语，不要 placeholder


path: references/image-styles/style-presets.md
content: # 正文配图风格预设

> 封面风格预设见 [cover-styles/](../cover-styles/)，本文件仅用于正文配图的自动推荐。

按文章类型推荐 Type + Style 组合（Style 为 Agent 内部选择，非用户配置维度）。用户也可手动覆盖其中任一维度。

## 按文章类型

### 科技与技术

| 预设 | Type | Style | 适用 |
|------|------|-------|------|
| `科技解析` | concept | 蓝图 | 技术原理、AI 概念、抽象概念具象化 |
| `系统设计` | architecture | 蓝图 | 架构图、系统设计、技术栈 |
| `工具评测` | comparison | 扁平矢量 | 工具对比、框架评测、方案PK |

### 知识与教程

| 预设 | Type | Style | 适用 |
|------|------|-------|------|
| `知识科普` | concept | 扁平矢量 | 概念解释、入门指南、隐喻科普 |
| `操作指南` | process | 简约线条 | 分步教程、操作流程、工作流 |
| `效率工具` | checklist | 简约线条 | 产品指南、SaaS 介绍、Tips 列表 |
| `课堂笔记` | whiteboard | 手绘 | 知识框架、原理讲解、课程笔记 |
| `知识全景` | mindmap | 扁平矢量 | 知识框架、主题概览、关系梳理 |

### 数据与分析

| 预设 | Type | Style | 适用 |
|------|------|-------|------|
| `数据报告` | data-viz | 商务 | 数据新闻、指标报告、统计分析 |
| `趋势对比` | comparison | 扁平矢量 | 行业对比、趋势分析 |
| `发展历程` | timeline | 简约线条 | 里程碑、产品路线图、年度总结 |

### 故事与情感

| 预设 | Type | Style | 适用 |
|------|------|-------|------|
| `故事叙述` | scene | 温暖 | 个人随笔、成长故事、用户场景 |
| `生活方式` | atmosphere | 水彩 | 旅行、生活、文艺、散文 |
| `金句传播` | quote-card | 温暖 | 核心观点、名言金句、截图转发 |

### 观点与评论

| 预设 | Type | Style | 适用 |
|------|------|-------|------|
| `观点文章` | atmosphere | 海报 | 社论、评论、犀利观点 |

## 文章内容 → 预设推荐

根据文章类型（由 topics 或 writing 确定）自动推荐：

| 文章内容信号 | 推荐预设 | 备选 |
|-------------|---------|------|
| API、代码、技术原理 | `科技解析` | `系统设计` |
| 概念、科普、入门指南 | `知识科普` | `课堂笔记` |
| 教程、步骤、操作 | `操作指南` | `知识科普` |
| 对比、评测、选择 | `工具评测` | `趋势对比` |
| 数据、报告、指标 | `数据报告` | `趋势对比` |
| 知识框架、关系梳理 | `知识全景` | `课堂笔记` |
| 历程、里程碑、路线 | `发展历程` | `数据报告` |
| Tips、要点、注意事项 | `效率工具` | `知识科普` |
| 故事、经历、场景 | `故事叙述` | `生活方式` |
| 金句、核心观点 | `金句传播` | `观点文章` |
| 观点、评论、争议 | `观点文章` | — |
| 工具、产品、SaaS | `效率工具` | `知识科普` |


path: references/image-styles/styles.md
content: # 正文配图风格库

> 本文件用于**正文配图**的 Type 分类与 Style 内部参考。**封面风格**由独立预设体系管理，见 [cover-styles/](../cover-styles/)。

## Type（画面构成）

12 种图片类型，描述"画什么"：

| Type | 名称 | 说明 | 适用场景 |
|------|------|------|---------|
| `concept` | 概念讲解 | 视觉隐喻把抽象概念具象化 | 原理解释、概念科普、隐喻 |
| `process` | 流程步骤 | 分步引导图，1-2-3 清晰明了 | 教程、操作指南、工作流 |
| `whiteboard` | 板书白板 | 像老师在白板上手写画图 | 知识科普、原理讲解、课程笔记 |
| `data-viz` | 数据可视化 | 数字变图表，让数据说话 | 趋势分析、统计、报告 |
| `comparison` | 对比说明 | 左右/上下并排，一眼看清差异 | 方案对比、产品PK、改版前后 |
| `architecture` | 架构图 | 分层结构图，展示组成关系 | 系统架构、产品架构、技术栈 |
| `mindmap` | 思维导图 | 中心主题向外发散分支 | 知识框架、主题概览、关系梳理 |
| `timeline` | 时间线 | 按时间轴排列事件或里程碑 | 发展历程、路线图、年度总结 |
| `checklist` | 清单图 | 条目化要点配图标 | Tips、注意事项、最佳实践 |
| `quote-card` | 金句卡片 | 突出核心观点或名言金句 | 金句、核心结论、截图转发 |
| `scene` | 场景还原 | 还原真实使用场景，代入感 | 用户场景、产品展示、生活方式 |
| `atmosphere` | 氛围烘托 | 营造情绪氛围，视觉呼吸 | 情感渲染、散文配图、阅读节奏 |

封面图不属于以上 Type，由独立的封面预设体系管理（见 [cover-styles/](../cover-styles/)）。

## Style（视觉风格）— Agent 内部参考

以下风格供 Agent 在自动选择正文配图视觉风格时参考，**不作为用户配置维度**。

| 核心风格 | 描述 | 适用场景 |
|---------|------|---------|
| `扁平矢量` | 扁平化设计，清晰几何形状 | 知识科普、教程、科技 |
| `简约线条` | 极简手绘线条 | 通用、知识分享、SaaS |
| `蓝图` | 技术蓝图风 | 架构设计、系统设计 |
| `手绘` | 手绘涂鸦风 | 轻松、随笔 |
| `水彩` | 水彩柔和 | 生活方式、情感 |
| `海报` | 海报丝印风 | 观点、社论 |
| `温暖` | 温暖亲切 | 个人成长、教育 |
| `极简` | 极简留白 | 哲学、极简主义 |
| `商务` | 精致商务 | 商业、深度报道 |

## 按 Type 的默认风格

| Type | 首选风格 | 备选 |
|------|---------|------|
| concept 概念讲解 | 扁平矢量 | 简约线条、手绘 |
| process 流程步骤 | 扁平矢量 | 简约线条、蓝图 |
| whiteboard 板书白板 | 手绘 | 简约线条 |
| data-viz 数据可视化 | 扁平矢量 | 商务、极简 |
| comparison 对比说明 | 扁平矢量 | 简约线条、商务 |
| architecture 架构图 | 蓝图 | 扁平矢量、简约线条 |
| mindmap 思维导图 | 扁平矢量 | 简约线条、手绘 |
| timeline 时间线 | 简约线条 | 扁平矢量、商务 |
| checklist 清单图 | 扁平矢量 | 简约线条、温暖 |
| quote-card 金句卡片 | 温暖 | 手绘、海报、极简 |
| scene 场景还原 | 温暖 | 水彩、手绘 |
| atmosphere 氛围烘托 | 温暖 | 水彩、手绘 |
| 封面 | 由封面预设体系管理 | 见 [cover-styles/](../cover-styles/) |


path: references/specs.md
content: # 图片规格

## 图中文字

画面内出现的文字**默认使用中文**。生成 prompt 时须直接写出要显示的中文文案，勿用 “labels in Chinese” 等元描述，否则多数模型会渲染成英文。

## 封面图

| 比例 | 尺寸参考 | 适用场景 |
|------|---------|---------|
| 2.35:1 | 900×383 | 宽幅电影感，适合科技/商务 |
| 16:9 | 1080×608 | 标准宽屏，通用 |
| 1:1 | 1080×1080 | 方形，适合品牌/人物 |

- 格式：JPG / PNG
- 单张建议 ≤ 2MB
- 风格按 `custom_cover_image_style` 指定的封面预设决定（见 `cover-styles/`）

## 正文配图

- 宽度建议：1080px（适配公众号正文区）
- 比例可按内容灵活调整
- 图注格式按配置 `caption_style`（如「图：XXX」）

## 多图推送

- 单条最多 9 张
- 张数偏好按配置 `multi_image_count`
- 每张需配文 + 顺序编号

## 品牌头图/尾图

- 路径按配置 `header_image` / `footer_image`
- 可固定版式复用


path: scripts/user_image_prepare.py
content: #!/usr/bin/env python3
"""
用户供图准备工具：
- 确保本篇 imgs/ 目录存在
- 基于 imgs/ 下的图片文件生成 img_analysis.md 模板
- 强制“推荐用途：封面”只能有一个

用法：
  python user_image_prepare.py drafts/20260402-slug
  python user_image_prepare.py drafts/20260402-slug --cover 02-taomi.png
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path


IMAGE_EXTS = {".png", ".jpg", ".jpeg", ".webp", ".gif"}


def _err(msg: str):
    print(f"[ERROR] {msg}", file=sys.stderr)
    sys.exit(1)


def _ok(msg: str):
    print(f"[OK] {msg}")


def _info(msg: str):
    print(f"[INFO] {msg}")


def _list_images(imgs_dir: Path) -> list[Path]:
    files = [p for p in sorted(imgs_dir.iterdir()) if p.is_file() and p.suffix.lower() in IMAGE_EXTS]
    return files


def _build_analysis_md(files: list[Path], cover_name: str | None) -> str:
    if not files:
        return "# 图片分析（img_analysis）\n\n> imgs/ 下暂无图片，请先上传后重跑。\n"

    if cover_name:
        matched = [p for p in files if p.name == cover_name]
        if not matched:
            _err(f"--cover 指定的文件不存在于 imgs/：{cover_name}")
        cover = matched[0]
    else:
        cover = files[0]

    lines = [
        "# 图片分析（img_analysis）",
        "",
        "> 说明：`推荐用途` 中“封面”只能出现一次；其余图片请标注“正文”。",
        "",
    ]
    for p in files:
        use = "封面" if p.name == cover.name else "正文"
        lines.extend(
            [
                f"## {p.name}",
                f"- 文件名：{p.name}",
                "- 图片内容：待补充（请描述画面主体、动作、场景）",
                "- 建议章节：待补充（例如：选米 / 淘米 / 浸泡 / 煮饭）",
                f"- 推荐用途：{use}",
                "- 图注建议：待补充",
                "",
            ]
        )
    return "\n".join(lines).rstrip() + "\n"


def main():
    parser = argparse.ArgumentParser(description="为用户上传图片生成 img_analysis.md 模板")
    parser.add_argument("article_dir", help="本篇目录，例如 drafts/20260402-slug")
    parser.add_argument("--cover", help="指定封面文件名（必须位于 imgs/）")
    parser.add_argument("--overwrite", action="store_true", help="覆盖已存在的 img_analysis.md")
    args = parser.parse_args()

    article_dir = Path(args.article_dir).resolve()
    if not article_dir.exists():
        _err(f"文章目录不存在：{article_dir}")

    imgs_dir = article_dir / "imgs"
    imgs_dir.mkdir(parents=True, exist_ok=True)
    _info(f"已确保目录存在：{imgs_dir}")

    analysis_path = article_dir / "img_analysis.md"
    if analysis_path.exists() and not args.overwrite:
        _err(f"img_analysis.md 已存在：{analysis_path}（如需覆盖请加 --overwrite）")

    files = _list_images(imgs_dir)
    content = _build_analysis_md(files, args.cover)
    analysis_path.write_text(content, encoding="utf-8")
    _ok(f"已写入：{analysis_path}")
    _info("请补充“图片内容/建议章节/图注建议”，并确保推荐用途里“封面”仅 1 处。")


if __name__ == "__main__":
    main()



path: skill.json
content: {
  "name": "aws-wechat-article-images",
  "version": "0.5.0",
  "author": "aiworkskills",
  "description": "为公众号文章生成封面图和正文配图，根据文章内容自动匹配风格。",
  "license": "MIT",
  "homepage": "https://github.com/aiworkskills/wechat-article-skills",
  "tags": ["wechat", "公众号", "images", "ai-generation"],
  "permissions": ["filesystem", "network", "shell"],
  "entryPoint": {
    "type": "natural",
    "path": "SKILL.md"
  },
  "dependencies": []
}


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