优化SKILL

main
maomomo 2026-06-28 15:32:23 +08:00
parent 8536f5ebce
commit 86f4d6e744
20 changed files with 287 additions and 62 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
*.zip
.DS_Store

View File

@ -35,10 +35,13 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
- 写作前必须先给用户确认标题或标题方向、文章核心口径、`outline.md` 大纲、来源缺口、必选素材映射和配图风格。用户明确要求跳过确认时,未确认事实仍必须标 `【待确认:...】`
- 大纲未确认前,不得创建最终 `deck_spec.json`、`speech.md`、图片 prompt jobs、文章配图图片、ZIP 或用户指定的最终文章包。
- 出图前必须先把全部图片 prompt 写入文件,包含文件名、用途、放置位置、核心文案、完整 prompt 和依赖素材;不要在聊天里输出超长 prompt。
- 图片 prompt 中的视觉风格只能作为后台画面描述不得成为画面文字prompt 必须限制可见文字只包含指定业务文案和 `MAOMOMO`不得出现风格标签、prompt 描述、额外 slogan 或无关文字。
- 发布稿、图片文案、prompt、manifest 和 `deck_spec.json` 中金额统一写 `HKD`,不要使用港币符号;来源原文抽取文件可保留原文写法。
- 金融活动配图如出现信用卡、支付卡、卡组织或支付网络,必须按官方材料或用户素材核对并记录来源;用户提供卡面参考图时保存到 `sources/`,不得把银联 / UnionPay 画成 Mastercard、Visa 等其他卡组织。
- 先只生成一张代表性风格确认图,优先封面图,保存为正式命名,例如 `origin_image/hsbc-mastercard-alipay-campaign-01-cover.png`。用户批准样张前不得批量生成剩余图片。
- 样张批准后,后续每张图片必须继承同一个生图后端、同一套视觉系统和同一种质量配置;不得为了加快速度擅自改成 `low`
- 每张最终图片必须来自确认后的图片生成后端:当前 agent 的内置图片生成工具,或用户确认后的 `scripts/maomomo_image_gen.py` API/CLI fallback。不得用 Playwright、HTML/CSS、SVG、Pillow、canvas、本地拼贴或手工文字覆盖冒充最终生成图。
- 生成图片按“一张图一个 job / 一次请求”推进。运行环境支持子 agent 时,样张通过后可以一图一个子 agent 并发处理;每个 dispatch、结果和 blocker 都必须写入状态文件,不能只靠聊天说明。
- 生成图片按“一张图一个 job / 一次请求 / 一次 QA”推进;通过 QA 后才用状态脚本记录 result 并同步到 `assets/`,不能只生成到 `origin_image/` 后声称完成。运行环境支持子 agent 时,样张通过后可以一图一个子 agent 并发处理;每个 dispatch、结果和 blocker 都必须写入状态文件,不能只靠聊天说明。
- 完整交付模式下,不能只在聊天里输出正文;必须生成 Markdown 文件、`assets/` 目录和 ZIP 包,除非用户明确说只要文字、只要大纲、不要图片、不要打包或先不生成文件。
- 配图文件必须是独立 PNG不要用一张大拼图代替多张图不要只给提示词冒充图片文件。
- 后续改稿必须更新文件本体;影响图片、来源区、标题、摘要或 ZIP 时同步更新。
@ -111,6 +114,9 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
├── assets/
│ ├── {article_slug}_01_cover.png
│ └── ...
├── sources/
│ ├── card-reference.png
│ └── ...
├── prompts/
│ ├── {article_slug}_01.json
│ └── ...
@ -124,12 +130,16 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
```
- `origin_image/` 保存图片后端生成并通过 QA 的原始最终图;`assets/` 保存 Markdown 实际引用的发布图片。两者可以是同名复制件,但不得只保留临时图。
- `deck_spec.json` 记录文章级上下文、确认后的风格、生图后端、样张生成方法 `sample_generation_method` 和图片任务列表。
- `sources/` 保存用户提供的卡面、支付网络、官方截图或其他参考素材,供 prompt、manifest 和 `deck_spec.json` 映射引用。
- `deck_spec.json` 记录文章级上下文、确认后的风格、生图后端、样张生成方法 `sample_generation_method`、参考素材映射和图片任务列表。
- `prompts/{article_slug}_XX.json` 记录每张图的文件名、用途、放置位置、核心文案、完整 prompt、依赖素材和输出路径。
- `slide_jobs.json``slide_run_state.json` 记录每个图片 job 的 pending / dispatched / recorded / blocked 状态;使用 `scripts/maomomo_job_state.py` 初始化和记录状态。
8. 出图前整理全部 prompt。
- 每张图的文件名、用途、放置位置、核心文案、完整 prompt、alt text、风格、依赖素材和输出路径先写入 `prompts/` 或 manifest 文件。
- prompt 中不要写“暖橙金融教程风”“数据仪表盘风”“手绘便签风”等容易被模型照抄的中文风格标签;改写为白底、暖橙强调、信息卡片、猫咪向导、清晰标题等视觉描述。
- 每张图的 prompt 必须明确:只允许出现指定业务文案和 `MAOMOMO`不得添加副标题、风格标签、prompt 描述、说明文字、额外 slogan 或无关文字。
- 封面只放最高优先级结论和少量核心数字;复杂计算、全年理论上限、长公式和详细规则放到计算图或正文。
- 不要在聊天里输出超长 prompt告诉用户可直接编辑 prompt 文件。
- 如果用户修改 prompt先同步文件再生成图片。
@ -150,6 +160,7 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
11. 记录状态、QA 和返修。
- 每个图片 job 的 dispatch、结果和 blocker 都用 `scripts/maomomo_job_state.py` 写入 `slide_jobs.json` / `slide_run_state.json`,不能只靠聊天说明完成。
- 每张图通过前必须检查日期、金额、公式、卡组织 / 支付网络、禁用分支、风格说明文字、伪造截图、乱码和多余文案。
- 检查文字清晰度、中文乱码、金额 / 日期 / 规则是否残留旧口径、标题截断、风格一致性、必选素材是否正确、元素是否重叠、是否伪造截图或 Logo。
- 严重问题重新生成该单张;局部问题优先使用已确认后端的编辑能力修复,不得本地手工覆盖关键文字冒充模型输出。
@ -157,7 +168,7 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
- `speech.md` 用作每张图的备注 / 讲解稿,标题格式使用 `## Slide N: 标题`,便于和图片顺序映射。
- 组装最终文章包时,把 `origin_image/{article_slug}_XX.png` 按顺序同步到 Markdown 引用的 `assets/`,并确保 `article.md`、图片路径、`speech.md`、来源区和 ZIP 都是最新版本。
- 完整交付、文件交付或改稿打包前读 `references/delivery-rules.md`
- QA 必须检查 Markdown 图片路径、assets 是否存在、来源区只保留实际使用来源、正文无编辑痕迹、图片无错误日期 / 金额 / 未确认结论、用户要求删除内容不残留、ZIP 内容正确。
- QA 必须用脚本检查 Markdown 中所有图片路径真实存在,并检查 assets 是否存在、来源区只保留实际使用来源、正文无编辑痕迹、图片无错误日期 / 金额 / 未确认结论、用户要求删除内容不残留、ZIP 内容正确。
- 最终回复保持简短给出项目目录、文章路径、图片目录、ZIP 路径、图片数量、生图后端、状态记录情况、备注写入情况和已知限制。
## 模式选择
@ -198,7 +209,7 @@ description: 生成或优化符合 maomomo / 猫MOMO 风格的中文出海金融
- `references/source-and-fact-check.md`:来源读取、事实表、时效性、冲突口径和金融风险核查。
- `references/style-guide.md`MAOMOMO 文章类型、标题套路、语气、结构模板、小红书模式和写作细节。
- `references/visual-assets.md`配图类型、猫咪视觉、文件命名、Markdown 插图、禁止伪造截图和图片 QA。
- `references/visual-assets.md`配图类型、猫咪视觉、文件命名、Markdown 插图、金融卡面核对、可见文字限制、禁止伪造截图和图片 QA。
- `references/recommended-styles.md`:推荐配图风格、适用场景、推荐话术和提示词片段。
- `references/image-styles/*.md`:具体出图风格 brief借鉴 `codex-ppt-skill` 风格库结构并适配 MAOMOMO 文章配图。
- `references/image-generation.md`:图片生成后端选择、`scripts/maomomo_image_gen.py` 用法、`scripts/maomomo_job_state.py` 状态记录、manifest 和故障处理。

View File

@ -29,7 +29,8 @@
4. 出图前把全部图片 prompt 写入 `prompts/` 或 manifest 文件,让用户可直接编辑。
5. 先生成并确认一张样张,优先封面图;样张确认后再逐张生成剩余独立高清 PNG。
6. 将通过 QA 的图片同步到 `assets/` 目录,并以相对路径插入 Markdown例如 `![图片说明](assets/hsbc-mastercard-alipay-campaign-01-cover.png)`
7. 创建 ZIP 包,结构类似:
7. 用脚本检查 Markdown 中所有本地图片路径真实存在。
8. 创建 ZIP 包,结构类似:
```text
article_package.zip
@ -40,7 +41,7 @@ article_package.zip
hsbc-mastercard-alipay-campaign-03-timeline.png
```
8. 最终回复只给路径和极简说明,同时说明图片数量、生图后端、状态记录和已知限制。
9. 最终回复只给路径和极简说明,同时说明图片数量、生图后端、状态记录和已知限制。
如果因为工具限制、图片生成失败、文件写入失败或资料缺失导致无法完成完整交付,必须明确说明失败点,并尽量交付已经完成的部分。不要只输出配图提示词代替图片文件,不要只输出文章正文代替 Markdown 文件。
@ -69,9 +70,12 @@ article_package.zip
- 不要只生成一张大长图替代所有配图。
- 每张图必须有独立主题例如封面图、活动总览图、时间线图、重点规则图、交易法图、避坑图、FAQ 图。
- 不得使用未经用户提供的真实银行 Logo、券商 Logo 或支付品牌 Logo。
- 出现信用卡、支付卡、卡组织或支付网络时,必须按官方材料或用户素材核对,并在 prompt、manifest 或 `deck_spec.json` 记录参考素材和卡组织;不得把银联 / UnionPay 画成 Mastercard、Visa 等其他卡组织。
- 不得伪造真实 App 截图。
- 生成图应明确是“MAOMOMO 风格示意图 / 信息图”。
- prompt 中的视觉风格只能写成后台画面描述,不要写容易被模型照抄的中文风格标签;可见文字只允许出现指定业务文案和 `MAOMOMO`
- 生成图应明确是 MAOMOMO 示意图 / 信息图,不伪装成真实截图或官方页面。
- 生成后的原始最终图先保存到 `origin_image/`,通过 QA 后同步到 `assets/`,并插入 Markdown。
- 港币金额在发布稿、图片文案、prompt、manifest 和 `deck_spec.json` 中统一写 `HKD`,来源原文抽取文件除外。
- 图片文件名使用稳定英文小写命名,并包含主题前缀,例如 `hsbc-mastercard-alipay-campaign-01-cover.png`
- 不要使用中文文件名或缺少主题前缀的通用文件名作为最终 assets 文件名,避免站点路径兼容和多文章混淆问题。
- 不要用 Playwright、HTML/CSS、SVG、Pillow、canvas、本地拼贴或手工覆盖文字替代 GPT Image2 / 图片 API 生成最终配图。
@ -132,9 +136,12 @@ article_package.zip
- `slide_jobs.json` / `slide_run_state.json` 已记录图片任务状态;如缺少记录,最终回复必须说明原因。
- `origin_image/` 中最终原始图片存在。
- `assets/` 目录已生成。
- 所有 Markdown 图片路径都能对应到真实图片文件。
- 已运行 `uv run python scripts/maomomo_check_markdown_assets.py article/article.md` 或等效脚本,确认所有 Markdown 图片路径都能对应到真实图片文件。
- 图片是多张独立 PNG不是一张大图代替全部。
- 图片文件名包含文章主题前缀,未沿用旧文章文件名。
- 图片可见文字没有出现风格标签、prompt 描述、额外 slogan 或无关文案。
- 图片日期、金额、公式、卡组织 / 支付网络和禁用分支都已核对。
- 发布稿、图片文案、prompt、manifest、`deck_spec.json` 和 `speech.md` 中港币金额统一使用 `HKD`
- 文末来源区只包含实际使用的来源。
- 正文没有 `contentReference`、`oaicite`、调试标记或工具残留。
- 用户要求删除的分支,标题、正文、配图清单和来源区都已删除干净。

View File

@ -35,7 +35,7 @@
## 单张生成
```bash
python3 scripts/maomomo_image_gen.py generate \
uv run python scripts/maomomo_image_gen.py generate \
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
--style warm-fintech-guide \
--title "汇丰 Mastercard 支付宝活动" \
@ -46,15 +46,46 @@ python3 scripts/maomomo_image_gen.py generate \
先只看 prompt
```bash
python3 scripts/maomomo_image_gen.py generate \
uv run python scripts/maomomo_image_gen.py generate \
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
--style data-card-dashboard \
--title "返现计算图" \
--image-type "计算图" \
--core-text "HK$190 ÷ 9% ≈ HK$2112超过部分没有额外收益" \
--core-text "HKD 190 ÷ 9% ≈ HKD 2,112超过部分没有额外收益" \
--dry-run
```
## prompt 文件输入
- `prompts/*.json` 用于管理图片 job、路径、参考素材、可见文字白名单和完整 prompt。
- 如果生成脚本的 `--prompt-file` 读取纯文本,必须先从 JSON 的 `prompt` 字段抽取为同名 `.prompt.txt`,再把 `.prompt.txt` 传给图片接口。
- 不要把整个 JSON 文件作为 `--prompt-file` 传入;否则模型可能把 JSON 外壳、字段名或管理信息画进图片。
- 抽取出的 `.prompt.txt` 仍必须包含可见文字限制:只允许出现指定业务文案和 `MAOMOMO`不得出现风格标签、prompt 描述、额外 slogan 或无关文字。
推荐抽取方式:
```bash
uv run python - <<'PY'
from pathlib import Path
import json
path = Path("article/prompts/hsbc-mastercard-alipay-campaign_01.json")
data = json.loads(path.read_text(encoding="utf-8"))
prompt = str(data["prompt"]).strip()
out = path.with_suffix(".prompt.txt")
out.write_text(prompt + "\n", encoding="utf-8", newline="\n")
print(out)
PY
```
然后生成:
```bash
uv run python scripts/maomomo_image_gen.py generate \
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
--prompt-file article/prompts/hsbc-mastercard-alipay-campaign_01.prompt.txt
```
## 批量 manifest
manifest 示例:
@ -75,7 +106,7 @@ manifest 示例:
"file_name": "origin_image/hsbc-mastercard-alipay-campaign-02-calculation.png",
"type": "计算图",
"title": "怎么刷到刚刚好",
"core_text": "HK$190 ÷ 9% ≈ HK$2112超过部分没有额外收益",
"core_text": "HKD 190 ÷ 9% ≈ HKD 2,112超过部分没有额外收益",
"style": "data-card-dashboard"
}
]
@ -85,7 +116,7 @@ manifest 示例:
运行:
```bash
python3 scripts/maomomo_image_gen.py batch \
uv run python scripts/maomomo_image_gen.py batch \
--manifest article/image_manifest.json \
--base-dir article
```
@ -98,6 +129,8 @@ python3 scripts/maomomo_image_gen.py batch \
- 默认用 `generate` 单张生成;`batch` 只用于用户明确授权的全量生成或 dry-run prompt 输出。
- 即使使用 `batch`,脚本也是逐项请求图片接口;生成后仍要逐张 QA并把通过的图片同步到 `assets/`
- 发布用 Markdown 默认引用 `assets/`,因此如果 manifest 输出到 `origin_image/`,必须在 QA 后复制到对应 `assets/` 路径。
- 金融活动 manifest 中涉及信用卡、支付卡或支付网络时,必须记录 `reference_assets`、`payment_network` 和 `card_art_rule`,并在 QA 中核对卡组织没有画错。
- manifest、prompt、`deck_spec.json` 和发布稿中的港币金额统一使用 `HKD`,来源原文抽取文件除外。
## 内置风格名
@ -118,7 +151,7 @@ python3 scripts/maomomo_image_gen.py batch \
查看完整描述:
```bash
python3 scripts/maomomo_image_gen.py styles
uv run python scripts/maomomo_image_gen.py styles
```
## 失败处理
@ -153,40 +186,40 @@ python3 scripts/maomomo_image_gen.py styles
初始化状态:
```bash
python3 scripts/maomomo_job_state.py init article \
uv run python scripts/maomomo_job_state.py init article \
--selected-backend "built-in image tool"
```
查看状态:
```bash
python3 scripts/maomomo_job_state.py status article
uv run python scripts/maomomo_job_state.py status article
```
记录 dispatch
```bash
python3 scripts/maomomo_job_state.py dispatch article \
uv run python scripts/maomomo_job_state.py dispatch article \
--job hsbc-mastercard-alipay-campaign_02 \
--agent-id "<agent id>" \
--prompt-file prompts/hsbc-mastercard-alipay-campaign_02.json
```
记录结果并同步到 `origin_image/``assets/`
单张 QA 通过后,记录结果并同步到 `origin_image/``assets/`
```bash
python3 scripts/maomomo_job_state.py result article \
uv run python scripts/maomomo_job_state.py result article \
--job hsbc-mastercard-alipay-campaign_02 \
--agent-id "<agent id>" \
--backend-used "built-in image tool" \
--selected-source /absolute/path/to/generated.png \
--qa-note "文字清楚,风格与样张一致。"
--qa-note "文字清楚,日期、金额、公式和卡组织已核对,风格与样张一致。"
```
记录 blocker
```bash
python3 scripts/maomomo_job_state.py blocker article \
uv run python scripts/maomomo_job_state.py blocker article \
--job hsbc-mastercard-alipay-campaign_02 \
--agent-id "<agent id>" \
--reason "选定图片后端在 worker 中不可用"

View File

@ -45,5 +45,5 @@
## Prompt 片段
```text
MAOMOMO 创意杂志风中文封面,大标题、强留白、暖橙品牌点缀,金融物件原创插画,白橘猫作为角落品牌元素,画面像编辑部攻略封面,不像银行广告。
中文金融文章封面,大标题、强留白、暖橙品牌点缀,金融物件原创插画,白橘猫作为角落品牌元素,画面像编辑部攻略封面,不像银行广告,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```

View File

@ -46,5 +46,5 @@
## Prompt 片段
```text
MAOMOMO 复古扁平插画风,低饱和暖色,扁平信用卡、小票、日历、计算器和白橘猫,中文标题清楚,轻松但不夸张,包含 MAOMOMO 标识。
低饱和暖色,扁平信用卡、小票、日历、计算器和白橘猫,中文标题清楚,轻松但不夸张,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -46,5 +46,5 @@
## Prompt 片段
```text
MAOMOMO 小红书竖版攻略风,9:16大字少字手机端可读暖橙白底白橘猫水印适合 4 图系列,包含 MAOMOMO 标识。
9:16 竖版,大字少字,手机端可读,暖橙白底,白橘猫水印,适合 4 图系列,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -46,5 +46,5 @@
## Prompt 片段
```text
MAOMOMO 手绘便签风,近白纸感背景,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤短而清晰,适合避坑和保姆式教程。
近白纸感背景,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤短而清晰,适合避坑和保姆式教程,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```

View File

@ -47,5 +47,5 @@
## Prompt 片段
```text
MAOMOMO 数据卡片仪表盘风,白底KPI 卡片、计算公式、时间线和风险标签清晰分区,金额和日期大号可读,白橘猫只做小型提示元素,包含 MAOMOMO 标识。
白底KPI 卡片、计算公式、时间线和风险标签清晰分区,金额和日期大号可读,白橘猫只做小型提示元素,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -52,5 +52,5 @@
## Prompt 片段
```text
MAOMOMO 暖橙金融教程风,明亮白底,暖橙强调色,干净信息卡片,友好的白橘猫作为向导,中文标题和关键数字清晰,包含 MAOMOMO 标识。
明亮白底,暖橙强调色,干净信息卡片,友好的白橘猫作为向导,中文标题和关键数字清晰,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -52,5 +52,5 @@
## Prompt 片段
```text
MAOMOMO 清爽专业风,浅色背景,蓝绿与暖橙强调色,结构化信息卡片,清晰中文标题和步骤,白橘猫作为小型向导,包含 MAOMOMO 标识,不伪造真实 App 截图。
浅色背景,蓝绿与暖橙强调色,结构化信息卡片,清晰中文标题和步骤,白橘猫作为小型向导,包含 MAOMOMO 标识,不伪造真实 App 截图。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -47,5 +47,5 @@
## Prompt 片段
```text
MAOMOMO 清爽编辑部风,白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面。
白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```

View File

@ -46,5 +46,5 @@
## Prompt 片段
```text
MAOMOMO 电子墨水杂志风,纸感背景,黑白灰为主,少量暖橙强调,大标题和元信息条,原创抽象金融视觉,克制高级,包含 MAOMOMO 标识。
纸感背景,黑白灰为主,少量暖橙强调,大标题和元信息条,原创抽象金融视觉,克制高级,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -47,5 +47,5 @@
## Prompt 片段
```text
MAOMOMO 科研答辩风,浅色严谨版式,来源卡片、条件树、证据矩阵和结论区清晰,暖橙强调风险提示,白橘猫只作为小型品牌元素。
浅色严谨版式,来源卡片、条件树、证据矩阵和结论区清晰,暖橙强调风险提示,白橘猫只作为小型品牌元素,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```

View File

@ -47,5 +47,5 @@
## Prompt 片段
```text
MAOMOMO 麦肯锡简报风,结论先行白底深色标题2x2 矩阵或方案对比表,暖橙突出推荐路径和风险提醒,包含 MAOMOMO 标识。
结论先行白底深色标题2x2 矩阵或方案对比表,暖橙突出推荐路径和风险提醒,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```

View File

@ -56,7 +56,7 @@
提示词片段:
```text
MAOMOMO 暖橙金融教程风,明亮白底,暖橙强调色,干净卡片布局,友好的白橘猫作为向导,现代 App 教程质感,中文标题清楚,包含 MAOMOMO 标识。
明亮白底,暖橙强调色,干净卡片布局,友好的白橘猫作为向导,现代 App 信息卡片质感,中文标题清楚,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。
```
## data-card-dashboard
@ -77,7 +77,7 @@ MAOMOMO 暖橙金融教程风,明亮白底,暖橙强调色,干净卡片布
提示词片段:
```text
MAOMOMO 数据卡片仪表盘风,白底,暖橙和蓝灰辅助色,使用指标卡、表格、时间线和计算公式展示关键信息,中文数字清晰可读,猫咪作为小型提示元素。
白底,暖橙和蓝灰辅助色,使用指标卡、表格、时间线和计算公式展示关键信息,中文数字清晰可读,猫咪作为小型提示元素,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```
## clean-professional
@ -118,7 +118,7 @@ MAOMOMO 数据卡片仪表盘风,白底,暖橙和蓝灰辅助色,使用指
提示词片段:
```text
MAOMOMO 清爽编辑部风,白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面。
白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```
## retro-flat-illustration
@ -149,7 +149,7 @@ MAOMOMO 清爽编辑部风,白底大标题,轻杂志排版,暖橙点缀,
提示词片段:
```text
MAOMOMO 手绘便签风,白底纸感,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤清楚,适合避坑经验和保姆式教程。
白底纸感,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤清楚,适合避坑经验和保姆式教程,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```
## e-ink-editorial
@ -200,7 +200,7 @@ MAOMOMO 手绘便签风,白底纸感,暖橙便利贴,手绘箭头和圈注
提示词片段:
```text
MAOMOMO 小红书竖版攻略风,9:16手机端可读大标题少量关键数字暖橙白底白橘猫水印适合 4 图看完的中文金融攻略。
9:16 竖版,手机端可读,大标题,少量关键数字,暖橙白底,白橘猫水印,适合 4 图看完的中文金融攻略,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO
```
## 风格选择输出格式

View File

@ -27,6 +27,11 @@ MAOMOMO 是偏实操的出海经验平台。公开站点标语是:“打破信
- 空泛的 SEO 背景介绍;
- 投资建议、法律建议、税务建议或结果保证。
金额写法:
- 发布稿、图片文案、prompt、manifest、`deck_spec.json` 和 `speech.md` 中,港币金额统一写 `HKD 1,000`
- 不使用 `HK$1,000`、`港币 1,000`、`1,000 港币` 作为发布写法;来源原文摘录或 OCR 可保留原样。
## 常见文章类型
### 1. 活动 / 返现 / 奖励攻略
@ -62,7 +67,7 @@ MAOMOMO 是偏实操的出海经验平台。公开站点标语是:“打破信
写法要点:
- 把实用公式放前面,例如 `HK$190 ÷ 9% ≈ HK$2112`。
- 把实用公式放前面,例如 `HKD 190 ÷ 9% ≈ HKD 2,112`。
- 直接写出“超过部分 = 没额外收益(不用多刷)”。
- 不支持的渠道要明确点名,例如“不支持支付宝 / 微信”。
- 活动要写开始日期、结束日期,以及本文是否“持续更新”。
@ -364,12 +369,12 @@ tags:
基础方向:
```text
MAOMOMO 风格封面图,干净的中文金融教程缩略图,友好的白橘猫吉祥物,圆脸、小爪子、暖橙色点缀,结合香港金融 / 信用卡 / 券商 / 转账场景,预留清晰中文标题区域,现代 App 仪表盘质感实用而非奢华明亮白色背景少量爪印细节不使用未经提供的真实银行标志不伪造真实截图界面16:9。
干净的中文金融实操文章封面,友好的白橘猫吉祥物,圆脸、小爪子,暖橙色点缀,结合香港金融 / 信用卡 / 券商 / 转账场景,预留清晰中文标题区域,现代 App 信息卡片质感,实用而非奢华,明亮白色背景,少量爪印细节,包含 MAOMOMO 标识,不使用未经提供的真实银行标志不伪造真实截图界面16:9。可见文字只允许出现指定业务文案和 MAOMOMO。
```
按主题追加对象:
- 信用卡 / 返现:香港信用卡、超市购物篮、返现计算器、小票、银联 / Apple Pay 风格的通用符号。
- 信用卡 / 返现:香港信用卡、超市购物篮、返现计算器、小票、通用支付符号;只有官方材料或用户素材确认后才画具体卡组织 / 支付网络
- 银行账户 / 保号保险库、账户余额仪表、ETF / 股票图表卡片、日历、警示标。
- 转账 / 入金路线箭头、HKD / EUR / USD 币种标签、手机转账界面插画、勾选标记。
- 券商活动股票礼品卡、K 线图、欢迎信封、香港天际线线稿。
@ -408,7 +413,7 @@ MAOMOMO 风格封面图,干净的中文金融教程缩略图,友好的白橘
提示词模板:
```text
生成一张干净的 MAOMOMO 风格中文信息图,使用暖橙色点缀和小型白橘猫吉祥物。展示【计算公式 / 路线 / 时间线】。画面使用简洁卡片、箭头、勾选标记、风险提示标签和清晰中文标注。整体为实用金融教程风白色背景不使用伪造官方标志16:9。
生成一张干净的中文金融实操信息图,使用暖橙色点缀和小型白橘猫吉祥物。展示【计算公式 / 路线 / 时间线】。画面使用简洁卡片、箭头、勾选标记、风险提示标签和清晰中文标注白色背景不使用伪造官方标志16:9。可见文字只允许出现指定业务文案和 MAOMOMO。
```
## 来源处理

View File

@ -15,8 +15,62 @@
- 生成图必须是“示意图 / 信息图 / 教程视觉”,不得伪造真实 App 截图、账单或官方页面。
- 用户提供真实截图时,优先用真实截图,并隐去姓名、账号、余额、地址、手机号、二维码、交易号等个人信息。
- 每张图必须包含清晰可见的 `MAOMOMO` 标识。
- 每张图的可见文字必须受控:只允许出现该图指定的业务文案和 `MAOMOMO`不得添加副标题、风格标签、prompt 描述、说明文字、额外 slogan 或无关文字。
- 不要用 Playwright、HTML/CSS、SVG、Pillow、canvas、本地拼贴或手工覆盖文字替代图片生成后端。
## 可见文字与 prompt 边界
- 视觉风格只作为后台画面描述,不得成为画面文字。
- 生成用 prompt 不要写容易被模型照抄到画面里的中文风格标签,例如“暖橙金融教程风”“数据仪表盘风”“手绘便签风”“清爽编辑部风”。
- 把风格名改写成可观察的视觉描述:白底、暖橙强调、信息卡片、猫咪向导、清晰标题、留白充足、表格感、时间线、轻纸感等。
- prompt 必须写明:画面只允许出现指定业务文案和 `MAOMOMO`不要添加副标题、风格标签、prompt 描述、说明文字、额外 slogan 或无关文字。
- `style` 字段可保留内部风格 ID例如 `warm-fintech-guide`,但完整 `prompt` 字段里不要把中文风格名当成可见文案写入。
推荐写法:
```text
明亮白底,暖橙强调色,干净信息卡片,友好的白橘猫作为向导,中文标题清楚,画面包含 MAOMOMO 标识。可见文字只允许出现「先报名再看门槛和封顶」和「MAOMOMO」。
```
不推荐写法:
```text
MAOMOMO 暖橙金融教程风,画出一张手绘便签风仪表盘图。
```
## 金融卡面与支付网络核对
- 金融活动配图中只要出现信用卡、支付卡、卡组织、支付网络或银行卡样式,必须先根据官方材料、用户截图或用户提供的卡面参考图核对。
- 用户提供卡面参考图时,把原始素材保存到 `sources/`,例如 `sources/gba-unionpay-card-reference.png`;不要只留在聊天上下文里。
- 在 `prompt`、manifest 和 `deck_spec.json` 中记录参考素材路径、卡组织 / 支付网络、是否允许出现卡组织标识,以及核对依据。
- 不得把银联 / UnionPay 卡画成 Mastercard、Visa、American Express 或其他卡组织;不确定时画“无卡组织标识的通用支付卡”。
- 未经用户提供或官方材料确认不要使用真实银行、卡组织、酒店、OTA 或支付机构 Logo必要时使用通用卡片、通用 POS、通用酒店图标。
- 如果官方活动限定某卡组织或指定卡面,图片 QA 必须把卡组织 / 支付网络列为必检项。
推荐记录字段:
```json
{
"reference_assets": ["sources/gba-unionpay-card-reference.png"],
"payment_network": "UnionPay / 银联",
"card_art_rule": "根据用户卡面参考图画银联 GBA 双币信用卡;不得出现 Mastercard 或 Visa 标识"
}
```
## 封面信息层级
- 封面只放最高优先级结论和少量核心数字,服务“读者一眼知道这篇讲什么、值不值得点开”。
- 不把复杂计算结论、全年理论上限、长公式、多重限制、详细规则或小字说明塞进封面。
- 计算过程、月度 / 年度理论上限、封顶拆解、资格分支和详细条款,应放到计算图、总览图或正文。
- 封面核心文案建议 1 句主标题 + 1-3 个短数字 / 短标签;如果超过手机端一眼可读的密度,拆到下一张图。
## 金额与币种写法
- 发布稿、图片文案、prompt、manifest、`deck_spec.json`、alt text 和 `speech.md` 中,港币金额统一写 `HKD 1,000`
- 不使用港币符号写法,例如 `HK$1,000`、`港币 1,000`、`1,000 港币`。
- 来源原文抽取文件、官方截图 OCR 或原文摘录可以保留来源写法;它们不作为发布内容检查对象。
- 如果来源使用港币符号,改写到发布内容时同步转换为 `HKD`
## 风格选择
如果用户没有指定视觉方向,生成图片前先读 `references/recommended-styles.md`,给 2-3 个可选风格,并推荐一个。确认后,整篇文章的配图保持同一套视觉身份:稳定的配色、猫咪造型、标题区、图标语言和信息密度;不同图片可以根据用途变化构图。
@ -72,7 +126,7 @@ C. handdrawn-note便签和手绘箭头更明显适合避坑经验和保姆
## 图片清单格式
生成图片前先规划清单,并同步写入 `prompts/{article_slug}_XX.json` 或图片 manifest。每个 prompt 文件至少包含文件名、类型、放置位置、核心文案、alt text、风格、依赖素材、输出路径和完整 prompt。
生成图片前先规划清单,并同步写入 `prompts/{article_slug}_XX.json` 或图片 manifest。每个 prompt 文件至少包含:文件名、类型、放置位置、核心文案、可见文字白名单、alt text、风格、依赖素材、输出路径和完整 prompt。涉及信用卡、支付卡或支付网络时,还要包含参考素材、卡组织 / 支付网络和核对依据。
```markdown
| 文件名 | 类型 | 放置位置 | 核心文案 | alt text | 风格 | 依赖素材 |
@ -94,10 +148,15 @@ C. handdrawn-note便签和手绘箭头更明显适合避坑经验和保姆
"type": "封面图",
"placement": "标题下方",
"core_text": "先报名,再看门槛和封顶",
"visible_text_allowed": ["先报名,再看门槛和封顶", "MAOMOMO"],
"alt_text": "MAOMOMO 汇丰 Mastercard 支付宝返现活动封面图",
"style": "warm-fintech-guide",
"required_assets": [],
"prompt": "完整图片生成 prompt包含风格、文案、约束和禁止项"
"reference_assets": [],
"payment_network": "",
"card_art_rule": "如无官方或用户参考素材确认,画无卡组织标识的通用支付卡",
"forbidden_visible_text": ["风格标签", "prompt 描述", "额外 slogan", "无关说明文字"],
"prompt": "完整图片生成 prompt包含视觉描述、指定业务文案、可见文字限制和禁止项"
}
```
@ -155,7 +214,7 @@ assets/
基础方向:
```text
MAOMOMO 风格中文金融教程信息图,干净明亮白色背景,暖橙色点缀,友好的白橘猫吉祥物,圆脸、小爪子,现代 App 仪表盘质感,清晰中文标题和卡片信息层级,实用而非奢华,包含 MAOMOMO 标识,不使用未经提供的真实银行标志,不伪造真实截图。
中文金融实操信息图,干净明亮白色背景,暖橙色点缀,友好的白橘猫吉祥物,圆脸、小爪子,现代 App 信息卡片质感,清晰中文标题和卡片信息层级,实用而非奢华,包含 MAOMOMO 标识,不使用未经提供的真实银行标志,不伪造真实截图。可见文字只允许出现指定业务文案和 MAOMOMO。
```
猫咪可以:
@ -173,7 +232,7 @@ MAOMOMO 风格中文金融教程信息图,干净明亮白色背景,暖橙色
## 主题追加元素
- 信用卡 / 返现:通用信用卡、小票、购物篮、返现计算器、Apple Pay 风格通用符号。
- 信用卡 / 返现:通用信用卡、小票、购物篮、返现计算器、通用支付符号;只有在官方材料或用户素材确认后,才画具体卡组织 / 支付网络
- 银行账户 / 保号:账户余额仪表、保险库、日历、警示标、活跃度卡片。
- 转账 / 入金路线箭头、HKD / EUR / USD 标签、手机转账示意界面、勾选标记。
- 券商活动股票礼品卡、K 线图、欢迎信封、香港天际线线稿。
@ -191,15 +250,27 @@ MAOMOMO 风格中文金融教程信息图,干净明亮白色背景,暖橙色
## 图片 QA
交付前检查:
每张图通过前检查:
- 样张已被用户确认,后续图片没有切换生图后端或视觉风格。
- 文件真实存在,格式为 PNG。
- `origin_image/` 原始最终图和 `assets/` 发布图对应。
- Markdown 路径能打开对应文件。
- 图片文字清楚,无乱码、错字和过期金额。
- 标题、金额、日期、规则与最终文章口径一致。
- 图片文字清楚,无乱码、错字、截断和多余文案。
- 可见文字只包含指定业务文案和 `MAOMOMO`没有副标题、风格说明文字、prompt 描述、额外 slogan 或无关说明。
- 标题、金额、币种、日期、公式、规则与最终文章口径一致;港币金额发布写法统一为 `HKD`
- 卡组织 / 支付网络与官方材料或用户参考素材一致;银联 / UnionPay 不得被画成 Mastercard、Visa 或其他卡组织。
- 没有出现用户已删除、已排除或禁止使用的活动分支、旧版规则、旧金额或旧标题。
- 没有真实个人信息。
- 没有伪造官方 App 页面或未经授权的品牌 Logo 场景。
- 没有把示意图伪装成真实截图、账单、订单、App 页面或官方页面。
- 每张图独立主题明确,不是同一画面的机械变体。
- 单张 QA 通过后,才用 `scripts/maomomo_job_state.py result` 记录结果并同步到 `assets/`;不得只生成到 `origin_image/` 后声称完成。
- `article.md` 已插入对应章节,且用脚本检查 Markdown 中所有图片路径真实存在。
- `slide_jobs.json` / `slide_run_state.json` 中没有未处理的 `pending`、`dispatched` 或 `blocked` job如有不能声称完整交付完成。
路径检查命令:
```bash
uv run python scripts/maomomo_check_markdown_assets.py article/article.md
```

View File

@ -0,0 +1,76 @@
#!/usr/bin/env python3
"""检查 Markdown 中引用的本地图片是否真实存在。"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import re
import sys
from typing import Iterable, List, Optional
from urllib.parse import urlparse
IMAGE_RE = re.compile(r"!\[[^\]]*\]\(([^)]+)\)")
def die(message: str, code: int = 1) -> None:
print(f"错误:{message}", file=sys.stderr)
raise SystemExit(code)
def normalize_target(raw: str) -> str:
value = raw.strip()
if value.startswith("<") and value.endswith(">"):
return value[1:-1].strip()
if " " in value:
value = value.split()[0]
return value.strip("'\"")
def is_remote_or_anchor(target: str) -> bool:
parsed = urlparse(target)
return bool(parsed.scheme in {"http", "https", "data", "mailto"} or target.startswith("#"))
def find_missing(markdown_path: Path) -> List[str]:
text = markdown_path.read_text(encoding="utf-8")
base_dir = markdown_path.parent
missing: List[str] = []
for match in IMAGE_RE.finditer(text):
target = normalize_target(match.group(1))
if not target or is_remote_or_anchor(target):
continue
image_path = Path(target)
if not image_path.is_absolute():
image_path = base_dir / image_path
if not image_path.exists():
missing.append(target)
return missing
def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="检查 Markdown 本地图片路径是否存在。")
parser.add_argument("markdown", help="要检查的 article.md 或其他 Markdown 文件。")
return parser
def main(argv: Optional[Iterable[str]] = None) -> int:
parser = build_parser()
args = parser.parse_args(list(argv) if argv is not None else None)
markdown_path = Path(args.markdown).expanduser().resolve()
if not markdown_path.exists():
die(f"Markdown 文件不存在:{markdown_path}")
missing = find_missing(markdown_path)
result = {
"markdown": str(markdown_path),
"missing_count": len(missing),
"missing": missing,
}
print(json.dumps(result, ensure_ascii=False, indent=2))
return 1 if missing else 0
if __name__ == "__main__":
raise SystemExit(main())

View File

@ -29,38 +29,38 @@ DEFAULT_STYLE = "warm-fintech-guide"
STYLE_PRESETS: Dict[str, str] = {
"warm-fintech-guide": (
"MAOMOMO 暖橙金融教程风:明亮白底,暖橙强调色,干净卡片布局,友好的白橘猫作为向导,"
"明亮白底,暖橙强调色,干净卡片布局,友好的白橘猫作为向导,"
"适合港卡、银行活动、返现攻略和教程总览。"
),
"clean-editorial": (
"清爽编辑部风:大标题、留白充足、少量暖橙和黑灰文字,像一张信息密度适中的中文攻略头图。"
"大标题、留白充足、少量暖橙和黑灰文字,像一张信息密度适中的中文攻略头图。"
),
"data-card-dashboard": (
"数据卡片仪表盘风:指标卡、时间线、计算公式和对比表清晰分区,适合返现、费用、门槛和路径对比。"
"指标卡、时间线、计算公式和对比表清晰分区,适合返现、费用、门槛和路径对比。"
),
"handdrawn-note": (
"手绘便签风:白底纸感、手绘箭头、便利贴、重点圈注和轻量猫咪贴纸,适合避坑经验和保姆式步骤。"
"白底纸感、手绘箭头、便利贴、重点圈注和轻量猫咪贴纸,适合避坑经验和保姆式步骤。"
),
"xiaohongshu-vertical": (
"小红书竖版攻略风:9:16 手机端可读大字少字强标题钩子4 图系列一致视觉,带 MAOMOMO 标识。"
"9:16 手机端可读大字少字强标题钩子4 图系列一致视觉,带 MAOMOMO 标识。"
),
"clean-professional": (
"清爽专业风:浅色背景、蓝绿或暖橙强调、结构化信息卡片和清晰层级,适合正式银行规则、开户教程和综合攻略。"
"浅色背景、蓝绿或暖橙强调、结构化信息卡片和清晰层级,适合正式银行规则、开户教程和综合攻略。"
),
"creative-magazine": (
"创意杂志风:大标题、强留白、编辑部排版和轻视觉冲击,适合传播型封面、观点总结和活动盘点。"
"大标题、强留白、编辑部排版和轻视觉冲击,适合传播型封面、观点总结和活动盘点。"
),
"retro-flat-illustration": (
"复古扁平插画风:低饱和暖色、扁平金融小物件、轻复古海报感,适合轻松羊毛攻略和经验分享。"
"低饱和暖色、扁平金融小物件、轻复古海报感,适合轻松羊毛攻略和经验分享。"
),
"e-ink-editorial": (
"电子墨水杂志风:纸感背景、黑白灰为主、少量强调色、强标题和元信息条,适合深度解释和观点型长文。"
"纸感背景、黑白灰为主、少量强调色、强标题和元信息条,适合深度解释和观点型长文。"
),
"scientific-defense": (
"科研答辩风:严谨浅色版式、证据图、流程框和来源标注,适合规则拆解、政策解读和多来源核对。"
"严谨浅色版式、证据图、流程框和来源标注,适合规则拆解、政策解读和多来源核对。"
),
"mckinsey-brief": (
"麦肯锡简报风:结论先行、矩阵、2x2、瀑布图和高对比商业配色适合方案对比、路径选择和决策建议。"
"结论先行、矩阵、2x2、瀑布图和高对比商业配色适合方案对比、路径选择和决策建议。"
),
}
@ -88,6 +88,24 @@ def read_json(path: Path) -> Any:
return json.loads(read_text(path))
def load_prompt_file(path: Path) -> str:
text = read_text(path).strip()
stripped = text.lstrip()
if path.suffix.lower() == ".json" or stripped.startswith("{"):
try:
data = json.loads(text)
except json.JSONDecodeError as exc:
die(f"--prompt-file 看起来是 JSON但解析失败{path}: {exc}")
if not isinstance(data, dict) or not isinstance(data.get("prompt"), str) or not data["prompt"].strip():
die("--prompt-file 不能传入缺少 prompt 字段的 JSON。请先抽取 prompt 字段生成 .prompt.txt。")
prompt = data["prompt"].strip()
prompt_out = path.with_suffix(".prompt.txt")
write_text(prompt_out, prompt + "\n")
warn(f"--prompt-file 收到 JSON已抽取 prompt 字段到:{prompt_out};后续请直接传入该 .prompt.txt。")
return prompt
return text
def load_codex_config_base_url() -> Optional[str]:
config_path = Path.home() / ".codex" / "config.toml"
if not config_path.exists():
@ -183,14 +201,17 @@ def build_prompt(
aspect_ratio: str,
extra: str = "",
) -> str:
allowed_visible = [value for value in (title, core_text, "MAOMOMO") if value.strip()]
allowed_visible_text = "".join(f"{value}" for value in allowed_visible)
parts = [
"生成一张 MAOMOMO 中文金融实操文章配图。",
f"图片类型:{image_type}",
f"标题 / 主题:{title}",
f"核心文案:{core_text}",
f"画幅:{aspect_ratio}",
f"视觉风格:{style_prompt(style)}",
"硬性要求:包含清晰可见的 MAOMOMO 标识;中文文字清楚可读;信息层级明确;不要伪造真实 App 截图;不要使用未经提供的银行、券商、支付机构或卡组织 Logo不要出现真实个人信息猫咪不能承载第三方品牌 Logo。",
f"画面呈现:{style_prompt(style)}",
f"可见文字限制:画面只允许出现这些指定业务文案:{allowed_visible_text}不要添加副标题、风格标签、prompt 描述、说明文字、额外 slogan 或无关文字。",
"硬性要求:包含清晰可见的 MAOMOMO 标识;中文文字清楚可读;信息层级明确;港币金额统一使用 HKD 写法;不要伪造真实 App 截图;不要使用未经提供的银行、券商、支付机构或卡组织 Logo没有明确素材或指令时信用卡画无卡组织标识的通用卡不要凭空加入 Mastercard、Visa、UnionPay 或其他支付网络;不要出现真实个人信息;猫咪不能承载第三方品牌 Logo。",
]
if extra.strip():
parts.append(f"补充要求:{extra.strip()}")
@ -253,7 +274,7 @@ def normalize_output(path: str, *, base_dir: Optional[Path]) -> Path:
def generate_one(args: argparse.Namespace) -> Dict[str, str]:
if args.prompt_file:
prompt = read_text(Path(args.prompt_file)).strip()
prompt = load_prompt_file(Path(args.prompt_file))
elif args.prompt:
prompt = args.prompt.strip()
else: