From 86f4d6e744ede4f181ab76d805492f57d1b93721 Mon Sep 17 00:00:00 2001 From: maomomo Date: Sun, 28 Jun 2026 15:32:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96SKILL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + SKILL.md | 19 ++++- references/delivery-rules.md | 15 +++- references/image-generation.md | 59 ++++++++++---- references/image-styles/创意杂志风.md | 2 +- references/image-styles/复古扁平插画风.md | 2 +- references/image-styles/小红书竖版攻略风.md | 2 +- references/image-styles/手绘便签风.md | 2 +- references/image-styles/数据仪表盘风.md | 2 +- references/image-styles/暖橙金融教程风.md | 2 +- references/image-styles/清爽专业风.md | 2 +- references/image-styles/清爽编辑部风.md | 2 +- references/image-styles/电子墨水杂志风.md | 2 +- references/image-styles/科研答辩风.md | 2 +- references/image-styles/麦肯锡简报风.md | 2 +- references/recommended-styles.md | 10 +-- references/style-guide.md | 13 +++- references/visual-assets.md | 85 +++++++++++++++++++-- scripts/maomomo_check_markdown_assets.py | 76 ++++++++++++++++++ scripts/maomomo_image_gen.py | 49 ++++++++---- 20 files changed, 287 insertions(+), 62 deletions(-) create mode 100644 scripts/maomomo_check_markdown_assets.py diff --git a/.gitignore b/.gitignore index c4c4ffc..4c8b8eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.zip +.DS_Store diff --git a/SKILL.md b/SKILL.md index b10836f..ee184f6 100644 --- a/SKILL.md +++ b/SKILL.md @@ -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 和故障处理。 diff --git a/references/delivery-rules.md b/references/delivery-rules.md index b6f000d..4cf1f52 100644 --- a/references/delivery-rules.md +++ b/references/delivery-rules.md @@ -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`、调试标记或工具残留。 - 用户要求删除的分支,标题、正文、配图清单和来源区都已删除干净。 diff --git a/references/image-generation.md b/references/image-generation.md index ac701f4..3ef605c 100644 --- a/references/image-generation.md +++ b/references/image-generation.md @@ -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 "" \ --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 "" \ --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 "" \ --reason "选定图片后端在 worker 中不可用" diff --git a/references/image-styles/创意杂志风.md b/references/image-styles/创意杂志风.md index 7998303..2e7f700 100644 --- a/references/image-styles/创意杂志风.md +++ b/references/image-styles/创意杂志风.md @@ -45,5 +45,5 @@ ## Prompt 片段 ```text -MAOMOMO 创意杂志风中文封面,大标题、强留白、暖橙品牌点缀,金融物件原创插画,白橘猫作为角落品牌元素,画面像编辑部攻略封面,不像银行广告。 +中文金融文章封面,大标题、强留白、暖橙品牌点缀,金融物件原创插画,白橘猫作为角落品牌元素,画面像编辑部攻略封面,不像银行广告,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/复古扁平插画风.md b/references/image-styles/复古扁平插画风.md index 9c44c77..0a66c5b 100644 --- a/references/image-styles/复古扁平插画风.md +++ b/references/image-styles/复古扁平插画风.md @@ -46,5 +46,5 @@ ## Prompt 片段 ```text -MAOMOMO 复古扁平插画风,低饱和暖色,扁平信用卡、小票、日历、计算器和白橘猫,中文标题清楚,轻松但不夸张,包含 MAOMOMO 标识。 +低饱和暖色,扁平信用卡、小票、日历、计算器和白橘猫,中文标题清楚,轻松但不夸张,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/小红书竖版攻略风.md b/references/image-styles/小红书竖版攻略风.md index dce3dba..fb932f3 100644 --- a/references/image-styles/小红书竖版攻略风.md +++ b/references/image-styles/小红书竖版攻略风.md @@ -46,5 +46,5 @@ ## Prompt 片段 ```text -MAOMOMO 小红书竖版攻略风,9:16,大字少字,手机端可读,暖橙白底,白橘猫水印,适合 4 图系列,包含 MAOMOMO 标识。 +9:16 竖版,大字少字,手机端可读,暖橙白底,白橘猫水印,适合 4 图系列,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/手绘便签风.md b/references/image-styles/手绘便签风.md index caa395e..06f76de 100644 --- a/references/image-styles/手绘便签风.md +++ b/references/image-styles/手绘便签风.md @@ -46,5 +46,5 @@ ## Prompt 片段 ```text -MAOMOMO 手绘便签风,近白纸感背景,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤短而清晰,适合避坑和保姆式教程。 +近白纸感背景,暖橙便利贴,手绘箭头和圈注,白橘猫举提示牌,中文步骤短而清晰,适合避坑和保姆式教程,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/数据仪表盘风.md b/references/image-styles/数据仪表盘风.md index 7ac2cda..ebf3ec5 100644 --- a/references/image-styles/数据仪表盘风.md +++ b/references/image-styles/数据仪表盘风.md @@ -47,5 +47,5 @@ ## Prompt 片段 ```text -MAOMOMO 数据卡片仪表盘风,白底,KPI 卡片、计算公式、时间线和风险标签清晰分区,金额和日期大号可读,白橘猫只做小型提示元素,包含 MAOMOMO 标识。 +白底,KPI 卡片、计算公式、时间线和风险标签清晰分区,金额和日期大号可读,白橘猫只做小型提示元素,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/暖橙金融教程风.md b/references/image-styles/暖橙金融教程风.md index 2757f73..67f6a99 100644 --- a/references/image-styles/暖橙金融教程风.md +++ b/references/image-styles/暖橙金融教程风.md @@ -52,5 +52,5 @@ ## Prompt 片段 ```text -MAOMOMO 暖橙金融教程风,明亮白底,暖橙强调色,干净信息卡片,友好的白橘猫作为向导,中文标题和关键数字清晰,包含 MAOMOMO 标识。 +明亮白底,暖橙强调色,干净信息卡片,友好的白橘猫作为向导,中文标题和关键数字清晰,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/清爽专业风.md b/references/image-styles/清爽专业风.md index 077ee8e..584a29c 100644 --- a/references/image-styles/清爽专业风.md +++ b/references/image-styles/清爽专业风.md @@ -52,5 +52,5 @@ ## Prompt 片段 ```text -MAOMOMO 清爽专业风,浅色背景,蓝绿与暖橙强调色,结构化信息卡片,清晰中文标题和步骤,白橘猫作为小型向导,包含 MAOMOMO 标识,不伪造真实 App 截图。 +浅色背景,蓝绿与暖橙强调色,结构化信息卡片,清晰中文标题和步骤,白橘猫作为小型向导,包含 MAOMOMO 标识,不伪造真实 App 截图。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/清爽编辑部风.md b/references/image-styles/清爽编辑部风.md index 081b35c..68090f9 100644 --- a/references/image-styles/清爽编辑部风.md +++ b/references/image-styles/清爽编辑部风.md @@ -47,5 +47,5 @@ ## Prompt 片段 ```text -MAOMOMO 清爽编辑部风,白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面。 +白底大标题,轻杂志排版,暖橙点缀,留白充足,白橘猫作为角落品牌元素,适合中文金融经验文章封面,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/电子墨水杂志风.md b/references/image-styles/电子墨水杂志风.md index 04cbea5..9ec0836 100644 --- a/references/image-styles/电子墨水杂志风.md +++ b/references/image-styles/电子墨水杂志风.md @@ -46,5 +46,5 @@ ## Prompt 片段 ```text -MAOMOMO 电子墨水杂志风,纸感背景,黑白灰为主,少量暖橙强调,大标题和元信息条,原创抽象金融视觉,克制高级,包含 MAOMOMO 标识。 +纸感背景,黑白灰为主,少量暖橙强调,大标题和元信息条,原创抽象金融视觉,克制高级,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/科研答辩风.md b/references/image-styles/科研答辩风.md index 1ff8655..0f97123 100644 --- a/references/image-styles/科研答辩风.md +++ b/references/image-styles/科研答辩风.md @@ -47,5 +47,5 @@ ## Prompt 片段 ```text -MAOMOMO 科研答辩风,浅色严谨版式,来源卡片、条件树、证据矩阵和结论区清晰,暖橙强调风险提示,白橘猫只作为小型品牌元素。 +浅色严谨版式,来源卡片、条件树、证据矩阵和结论区清晰,暖橙强调风险提示,白橘猫只作为小型品牌元素,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/image-styles/麦肯锡简报风.md b/references/image-styles/麦肯锡简报风.md index 0ae28d1..a478776 100644 --- a/references/image-styles/麦肯锡简报风.md +++ b/references/image-styles/麦肯锡简报风.md @@ -47,5 +47,5 @@ ## Prompt 片段 ```text -MAOMOMO 麦肯锡简报风,结论先行,白底深色标题,2x2 矩阵或方案对比表,暖橙突出推荐路径和风险提醒,包含 MAOMOMO 标识。 +结论先行,白底深色标题,2x2 矩阵或方案对比表,暖橙突出推荐路径和风险提醒,包含 MAOMOMO 标识。可见文字只允许出现指定业务文案和 MAOMOMO。 ``` diff --git a/references/recommended-styles.md b/references/recommended-styles.md index 3272557..ef6e5d6 100644 --- a/references/recommended-styles.md +++ b/references/recommended-styles.md @@ -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。 ``` ## 风格选择输出格式 diff --git a/references/style-guide.md b/references/style-guide.md index b2b77b5..3db7eab 100644 --- a/references/style-guide.md +++ b/references/style-guide.md @@ -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。 ``` ## 来源处理 diff --git a/references/visual-assets.md b/references/visual-assets.md index 05d8351..687da96 100644 --- a/references/visual-assets.md +++ b/references/visual-assets.md @@ -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 +``` diff --git a/scripts/maomomo_check_markdown_assets.py b/scripts/maomomo_check_markdown_assets.py new file mode 100644 index 0000000..75e0ef9 --- /dev/null +++ b/scripts/maomomo_check_markdown_assets.py @@ -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()) diff --git a/scripts/maomomo_image_gen.py b/scripts/maomomo_image_gen.py index 070267f..70e2e97 100644 --- a/scripts/maomomo_image_gen.py +++ b/scripts/maomomo_image_gen.py @@ -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: