aws-wechat-article-main · diff
git:20260911.7e79f04 to git:20260911.1a7fdc6
91 added, 260 removed. Audit A to A.
---
name: aws-wechat-article-main
description: 公众号运营|微信公众号|公众号一条龙|公众号全流程|自媒体运营|wechat automation|content pipeline|AIGC workflow — 公众号一条龙运营总控入口,选题→写稿→审稿→排版→配图→发布串联 8 个子 skill,单条指令完成整篇图文从 0 到上架。面向公众号小编、自媒体、品牌内容。触发词分层:**一条龙流程**「一条龙」「完整流程」「从头做」「从 0 到发布」;**新做新发**「帮我写篇公众号文章」「做一篇公众号文章」「我想发一篇」「帮我发一篇」「再来一篇」;**选题起点**「今天写什么好」「有什么好写的」「找个话题」「爆款选题」「热点选题」「起个爆款标题」;**策划起点**「内容日历」「系列策划」「专栏规划」「连载」;**流程恢复**「接着上次那篇」「继续昨天的」「继续上次的」「接着之前的进度」;**显式模型新写**「用 GPT 写一篇」「用 DeepSeek 写一篇」「把提纲写成文章」。子 skill(topics/writing/review/formatting/images/publish/sticker/assets)单独触发仅限对**已有产物**的修改场景(如"改标题""润色这段""排版""审稿""加封面""发布");新做/策划/多环节串联一律走本入口。
homepage: https://aiworkskills.cn
url: https://github.com/aiworkskills/wechat-article-skills
metadata:
openclaw:
requires:
env:
- WRITING_MODEL_API_KEY
- IMAGE_MODEL_API_KEY
- WECHAT_1_APPID
- WECHAT_1_APPSECRET
bins:
- python3
primaryEnv: aws.env
---
# 公众号运营总览
- **一键式公众号 AI 内容流水线** —— 从选题到上架 8 个子 skill 串联,公众号小编 / 自媒体 / 品牌内容团队一键产出整篇图文。
-
- > **套件说明** · `aws-wechat-article-*` 是公众号一条龙套件,共 9 个 slug:`aws-wechat-article-main / topics / writing / review / formatting / images / publish / assets`,外加 `aws-wechat-sticker`。跨 skill 的相对引用依赖同一 `skills/` 根目录;推荐 `clawhub sync` 或逐个 `clawhub install` 一次性全装。源码:<https://github.com/aiworkskills/wechat-article-skills>
-
- ## 能力披露(Capabilities)
-
- 本 skill 作为一条龙套件**编排入口**;真正调用外部 API 的是子 skill(writing / images / publish / sticker / review)。**本入口自身的 `validate_env.py` 脚本**行为:
-
- - **凭证读取**:读取仓库根 `aws.env` 的 `WRITING_MODEL_API_KEY` / `IMAGE_MODEL_API_KEY` / `WECHAT_{N}_APPID` / `WECHAT_{N}_APPSECRET`,**仅用于校验键是否存在且非空**,值不用于任何网络请求
- - **网络**:本入口脚本无外发请求;**子 skill 有外发**(详见各子 skill 的能力披露)
- - **文件读**:仓库内 `aws.env`、`.aws-article/config.yaml`、本篇 `article.yaml`
- - **文件写**:仓库内 —— `.aws-article/`(首次引导创建目录结构)、本篇 `article.yaml` 状态字段
- - **shell**:仅 `{python} {baseDir}/scripts/validate_env.py`(`{python}` = 本机 Python 3 解释器,由下文**第 0 步**探测得出:Windows 用 `py -3 -X utf8`,macOS / Linux 用 `python3`)
-
- > **注意**:整体套件(含子 skill)会调用外部 LLM、图像 API 与微信 API,并在调用时外发 API key 与本篇内容。完整行为见各子 skill 的「能力披露」。
-
- ## 配套 skill(informational)
-
- 本 skill 是 `aws-wechat-article-*` 一条龙公众号套件的入口,编排 8 个子 skill:`topics / writing / review / formatting / images / publish / assets` 以及 `aws-wechat-sticker`。
-
- - **装齐全部 9 个 slug** 到同一 `skills/` 根目录,才能走完整一条龙流程(选题→写稿→审稿→排版→配图→发布)。
- - 只装 main 一个时,仍可用于环境校验(`validate_env.py`);进入内容流水线会因对应子 skill 缺失而无法执行相关步骤(工作流里的跨 skill 脚本调用 / 文档读取会遇到 `file not found`)。
+ **一键式公众号 AI 内容流水线** —— 从选题到上架 8 个子 skill 串联。
- 完整 9 slug 清单与安装指引见 [源码仓库](https://github.com/aiworkskills/wechat-article-skills)。
+ > **套件说明** · `aws-wechat-article-*` 共 9 个 slug:`main / topics / writing / review / formatting / images / publish / assets`,外加 `aws-wechat-sticker`。跨 skill 的相对引用依赖同一 `skills/` 根目录;推荐 `clawhub sync` 一次性全装。源码:<https://github.com/aiworkskills/wechat-article-skills>
**Agent 执行**:确定本 SKILL.md 所在目录为 `{baseDir}`。
- ## 配置检查 ⛔ BLOCKING
-
- **进入交互顺序「2) 全局账号约束」「3) 本篇准备」及内容流水线前**须完成 **第 0~2.5 步**配置检测(任一步失败则 **不得** 继续)。**第 3 步**是**调用 `publish.py` 前**的核对(非流水线起点):**`.aws-article/config.yaml`** 中 **`publish_method`** 默认为 **`draft`**(**`publish.py full`** 只把图文写入**公众号草稿箱**);仅当用户明确要求「发出去 / 对外发布」时,再将该键改为 **`published`**(或使用 **`full --publish`** 临时强制发布)。**微信**:**`validate_env.py`** 默认要求公众号账号配齐(见第 2 步);用户**明确不接微信**时,先将 **`publish_method`** 设为 **`none`** 再过校验(脚本会跳过微信组),之后 **`publish.py full`** 仍直接跳过。要走草稿/发布,须补全 **`aws.env`** 与 **`config.yaml`** 微信槽位,并建议 **`check-wechat-env`**。`wechat_N_name` 只用于展示,写作/图片模型是可选项,这三项缺失时只警告。文风与账号约束以 **`config.yaml`** 为准,发文元数据以本篇 **`article.yaml`** 为准。
-
- ### 第 0 步:判断操作系统与 Python 解释器
-
- 智能体在执行下列检测命令前,**先判断当前环境**:
-
- - **Linux / macOS**:使用 Bash 命令(`test`、`echo` 等)。
- - **Windows**:使用 **PowerShell** 命令(`Test-Path` 等)。
-
- **再确定 `{python}`**——本套件所有文档里的 `{python}` 都是占位符,不是可直接执行的命令,须先探测出本机实际可用的 Python 3 解释器再代入。**本次会话探测一次即可**,之后所有 `{python}` 统一代入该结果。
-
- **Linux / macOS:**
-
- ```bash
- python3 --version
- ```
-
- 输出 `Python 3.x.x` → `{python}` = `python3`。命令不存在则改试 `python --version`,同样要求输出 `Python 3.`;都不行 → 提示用户安装 Python 3.10+ 后再继续,**不得**继续后续步骤。
-
- **Windows(PowerShell):**
-
- ```powershell
- py -3 --version
- ```
-
- 输出 `Python 3.x.x` → `{python}` = `py -3 -X utf8`。`py` 不可用时改试 `python --version`,通过则 `{python}` = `python -X utf8`。
-
- ⛔ **Windows 上不要探测 `python3`**:未安装 Python 时它是系统预置的应用执行别名,会**静默打开 Microsoft Store** 而不报错——你会拿到一个空输出、看不出失败原因。始终优先 `py -3`(python.org 官方安装器默认附带 py launcher,且不受该别名影响)。
-
- ⛔ **Windows 上的 `-X utf8` 不可省略**:本套件脚本输出大量中文,Windows 上 Python 的 stdout 编码默认跟随系统 locale(简体中文机器为 GBK),省略后你读到的会是乱码,进而误判脚本成败。
-
- **版本要求 Python 3.10+**。`--version` 显示低于 3.10 时先提示用户升级,再继续。
-
- ### 第 1 步:`.aws-article/config.yaml` 与 `aws.env` 是否存在
-
- 在**仓库根目录**(当前工作目录为项目根)执行:
-
- **Linux / macOS:**
-
- ```bash
- test -f .aws-article/config.yaml && test -f aws.env && echo "ok" || echo "missing"
- ```
-
- **Windows(PowerShell):**
-
- ```powershell
- if ((Test-Path -LiteralPath ".aws-article\config.yaml") -and (Test-Path -LiteralPath "aws.env")) { "ok" } else { "missing" }
- ```
-
- ⛔ 输出为 `missing`(任一文件不存在)→ 按 [首次引导](references/first-time-setup.md) 创建或补全:可参考 **`{baseDir}/references/config.example.yaml`** 得到 **`config.yaml`**,在仓库根创建 **`aws.env`**(仅密钥与微信 `WECHAT_N_APPID` / `WECHAT_N_APPSECRET` 等,键名可与 `{baseDir}/references/env.example.yaml` 对照)。
-
- **初始化约束**:新建 **`.aws-article/config.yaml`** 时,`publish_method` 默认必须为 **`draft`**;除非用户明确指定不接微信,否则禁止初始化或改写为 `none`。
-
- ### 第 2 步:校验配置内容(`validate_env.py`)
-
- 两文件均存在后,在仓库根运行:
-
- ```bash
- {python} {baseDir}/scripts/validate_env.py
- ```
-
- (默认读取 **`.aws-article/config.yaml`** 与 **`aws.env`**;可用 `--config` / `--env` 指定路径。)
-
- 脚本检查(规则摘要,具体交互文案统一以 [首次引导](references/first-time-setup.md) 为准):
-
- - **微信公众号**:`wechat_accounts`、`wechat_api_base` 与 **`aws.env`** 中每个槽位的 **`WECHAT_{i}_APPID` / `WECHAT_{i}_APPSECRET`** 须完整;否则 **`failed`** + **`微信公众号配置不完整`**,**退出码 1**。`wechat_{i}_name` 仅用于展示与按名选择,未填时只警告。**例外**:**`publish_method: none`** 时跳过微信组校验。
- - **写作模型**:`writing_model.base_url` / `model` 与 **`WRITING_MODEL_API_KEY`** 仅供外部写作 API 使用;未配置时输出警告,不影响退出码,Agent 可通过 `write.py prompt` 获取约束后代写。
- - **图片模型**:`image_model.base_url` / `model` 与 **`IMAGE_MODEL_API_KEY`** 仅供外部生图 API 使用;未配置时输出警告,不影响退出码。
-
- **退出码 0**:微信组通过,或已声明 **`publish_method: none`** 跳过微信组 → **`True`** + **`配置校验通过`**;三个可选项缺失会同时输出警告。**退出码 1**:微信必要配置未通过 → 不得进入一条龙默认流水线,并引导 [首次引导](references/first-time-setup.md) 补全或设为 **`publish_method: none`** 后重跑。
-
- ### 第 2.5 步:创建预设与运行目录(硬性前置,必须执行)
+ ## 能力披露(Capabilities)
- **仅当第 2 步退出码为 0** 才执行本步;执行成功后才允许进入「2) 全局账号约束」与后续流水线。
- 目录要求与命令以 [首次引导第 2 步](references/first-time-setup.md) 为准(需覆盖 `presets/*` 与 `tmp`)。**业务资料库 `.aws-article/products/{产品名}/`** 不在本步建——由 AI 写第一份业务介绍时按 [assets skill](../aws-wechat-article-assets/SKILL.md) 自动 mkdir。
+ 本 skill 是**编排入口**,真正调用外部 API 的是子 skill(writing / images / publish / sticker / review)。本入口自身只跑 `validate_env.py`:
- - **禁止**因为“环境检查通过”就跳过本步直接写稿。
- - 若目录已存在,可视为本步通过;若缺失,必须立即补建并继续校验。
+ - **凭证**:读 `aws.env` 的各 `*_API_KEY` 与 `WECHAT_{N}_*`,**仅校验键存在且非空**,值不用于任何网络请求
+ - **网络**:本入口无外发;**子 skill 有外发**,见各自的能力披露
+ - **文件读写**:`.aws-article/`、本篇 `article.yaml`
+ - **shell**:仅 `{python} {baseDir}/scripts/validate_env.py`
- ### 第 3 步:调用 `publish.py` 前(`publish_method` + 微信)
+ > 整体套件会调用外部 LLM、图像与微信 API,并在调用时外发 API key 与本篇内容。
- - **`publish_method`**(**`draft`** / **`published`** / **`none`**)写在 **`config.yaml`**,**默认 `draft`**。**`none`** = 用户明确不填微信:**`full`** 不调 API。要「发布出去」→ **`published`** 或 **`full --publish`**。
- - **微信**:在 **`aws.env`**;槽位在 **`config.yaml`**。**`draft`/`published`** 走 **`full`** 前须就绪;**`none`** 下不调用微信。
- - 运行 **`publish.py full`** 前:确认 **`publish_method`** 合法(小写);**非 `none`** 时建议 **`check-wechat-env`**。
+ 只装 main 一个时仍可做环境校验;进入流水线会因子 skill 缺失而 `file not found`。
- ### 智能体行为约束(禁止自作主张)
+ ## 配置检查 ⛔ BLOCKING
- 检测到 **`.aws-article/config.yaml` 或 `aws.env` 缺失**、**`validate_env.py` 退出码 1**(微信配置不完整,且未声明 **`publish_method: none`**),或用户**已要求调用 `publish.py`** 而微信槽位 / 凭证未就绪时:
+ **进入「全局账号约束」「本篇准备」及内容流水线之前**,必须按 **[首次引导](references/first-time-setup.md)** 完整走一遍「检测顺序」——判断 OS、探测 `{python}`、检查两份配置文件、跑 `validate_env.py`、创建预设目录。任一步失败**不得继续**。
- - **禁止**在未询问用户、未取得用户**明确文字确认**的情况下,自行决定:跳过微信配置、仅出 prompt 却继续宣称「一条龙已完成」、或继续排版/发布并假装配置已就绪。
- - **必须先**:向用户说明**具体缺哪一类**(脚本 **`failed`** 下的 **`微信公众号配置不完整`**;或即将 **`publish.py`** 但微信未配齐),并**统一按** [首次引导](references/first-time-setup.md) 中「校验失败时的配置引导」文案执行。
- - **输出约束**:该场景下除”环境检查结果”可按实际失败项替换外,其余引导文案须与首次引导保持一致。
- - 用户在本地编辑器中填好 `aws.env` 与 `config.yaml` 并保存后,智能体协助重跑 **`validate_env.py`** 复检;若用户明确声明本次例外,按首次引导与本节约束继续处理。
- - **凭证处理原则**:Agent **不得索取、不得接收**用户在对话里粘贴的 `APPSECRET` / `API_KEY` 等任何密钥;所有密钥由用户自己在编辑器里写入 `aws.env`(或通过 `https://aiworkskills.cn/` 平台配置)。Agent 只校验存在性、不读取值、不外发值。
+ 那份文档同时是**唯一**的失败引导来源与行为约束(禁止自作主张、不得索取密钥)出处,本文件不再复述。
- > **模型配置是可选项**:默认校验不因写作/图片模型缺失而阻断。进入对应阶段时,有外部 API 配置则可由脚本调用;没有时,写作由 Agent 根据 `write.py prompt` 执行,配图则根据当前 Agent 能力执行或再向用户说明。
+ 三个要点在这里说一次:
- > **单步子 skill**:用户只触发某一子能力(如仅排版、仅审稿)且**未走本总览流水线**时,仍以各子 skill 内说明为准;**一条龙 / 完整流程 / 从选题到发布** 必须满足本节 BLOCKING 与上条「禁止自作主张」。
+ - **`publish_method` 默认 `draft`**(`publish.py full` 只写公众号草稿箱)。用户明确要求「发出去」才改 `published`,或临时用 `full --publish`。
+ - **用户明确不接微信** → 先设 `publish_method: none` 再过校验,之后 `full` 会直接跳过。
+ - **写作 / 图片模型是可选项**,缺失时只警告、不阻断。
## 主要配置文件(不要混用)
| 文件 | 位置 | 作用 |
|------|------|------|
- | `aws.env` | **仓库根** | **密钥**:写作/图片 `*_API_KEY`、微信 `WECHAT_N_APPID` / `WECHAT_N_APPSECRET` 等(键名见 `references/env.example.yaml`;与 `config.yaml` 一起由 `validate_env.py` 校验) |
- | `.aws-article/config.yaml` | 仓库内 | **非密钥配置**:账号文风、模型 `provider`/`base_url`/`model`、微信槽位数与 `wechat_api_base`、各槽位展示名等(模板见 `references/config.example.yaml`) |
- | `references/env.example.yaml` | 仓库内示例 | **仅文档**:`aws.env` 键名说明 |
- | `references/config.example.yaml` | 仓库内示例 | **仅文档**:`config.yaml` 结构示例 |
- | `article.yaml` | **本篇目录** `drafts/YYYYMMDD-标题slug/` | **发文元数据**(标题/作者/摘要/封面等)及状态字段:**`image_source`**(仅 `generated` / `user`;默认 `generated`,用户上传配图时改为 `user`)与 **`publish_completed`**(新建 **`false`**,发布闭环结束 **`true`**),与 **`config.yaml`** 分工 |
-
- ### 发布方式与时间线
-
- 1. **账号与发布策略**:**文风、选题边界、`publish_method`(默认 **`draft`**)、微信槽位元数据**等均在 **`.aws-article/config.yaml`** 维护;**密钥**仅在 **`aws.env`**。
- 2. **本篇准备**(须先完成交互顺序 **「2) 全局账号约束」**):在 **定题与 slug** 之后新建 `drafts/YYYYMMDD-标题slug/`,并**优先**创建 **`article.yaml`**(含 **`publish_completed: false`**、标题/作者/摘要等;通常为本目录内**首个**应落盘的文件),再进入内容流水线。
- 3. **执行原则(严格顺序)**:必须按下述流水线顺序依次执行,**不能跳过任何部分**;每到一步若缺少必要输入(目录、元数据、主题、用户选择、发布意图等),要**先及时询问用户并获得确认**,再进入下一步,除非用户指出基于某个历史任务继续创作,那么需要智能体根据中间产物判断从哪个阶段开始。
- 4. **内容流水线**(子 skill 串行,详见下文 **「交互顺序」第 4 步** 与 **「流程」** 表):**选题**([topics](../aws-wechat-article-topics/SKILL.md))→ **写稿**([writing](../aws-wechat-article-writing/SKILL.md))→ **审稿(内容审)**([review](../aws-wechat-article-review/SKILL.md))→ **排版**([formatting](../aws-wechat-article-formatting/SKILL.md))→ **配图**([images](../aws-wechat-article-images/SKILL.md))→ **审稿(终审)**(review)。**内容审**产出的 **`article.md` 定稿须满足 [review 第 5 步](../aws-wechat-article-review/SKILL.md)(文末 **`{embed:…}`**,⛔ BLOCKING)后再排版。全程以 **`.aws-article/config.yaml`** 为账号与文风约束;典型产物依次为 `topic-card.md` / `draft.md` → `article.md` → `article.html` 与 `imgs/` 等。
- 5. **发布**([publish](../aws-wechat-article-publish/SKILL.md)):**`draft`** → **`full`** 仅**草稿箱**;**`published`** 或 **`full --publish`** → 再**提交发布**;**`none`** → **`full`** **立即跳过**、不调微信。前两档需微信凭证。
+ | `aws.env` | **仓库根** | **只放密钥**:`*_API_KEY`、`WECHAT_N_APPID` / `WECHAT_N_APPSECRET`(键名见 `references/env.example.yaml`) |
+ | `.aws-article/config.yaml` | 仓库内 | **账号级非密钥配置**:文风、选题边界、模型端点、微信槽位与 `publish_method`(模板见 `references/config.example.yaml`) |
+ | `article.yaml` | **本篇目录** | **本篇发文元数据**与状态:`image_source`(`generated` / `user`)、`publish_completed`(新建 `false`,发布闭环后 `true`) |
- **再强调**:**`aws.env`** = 密钥;**`config.yaml`** = 账号/文风/模型与微信元数据及 **`publish_method`**;**本篇 `article.yaml`** = 发文元数据。
+ 字段说明见 [articlescreening-schema.md](references/articlescreening-schema.md)。
- ## 交互顺序(一步步,最小提问)
+ ## 交互顺序
- 按以下顺序与用户交互,**上一步完成再进下一步**;上一环节就绪后再进入下一环节。
+ **上一步完成再进下一步。** 每步若缺必要输入(目录、元数据、主题、用户选择、发布意图),先问用户并取得确认;除非用户说明基于某个历史任务继续,那就按中间产物判断从哪个阶段接入。
- ### 1) 配置自检(必做)
+ ### 1) 配置自检 ⛔
- - 按上文 **配置检查** 完成:**`config.yaml` 与 `aws.env` 均存在** → 运行 **`validate_env.py`** **且退出码 0**。**退出码 1** 时按 [首次引导](references/first-time-setup.md) 补全微信必要配置;用户明确不接微信时可设为 **`publish_method: none`** 后重跑。
- - **`validate_env.py` 退出码 0 后,必须立即执行「第 2.5 步目录创建」**(可复用 [首次引导第 2 步](references/first-time-setup.md) 命令);该步完成前,**禁止**进入「2) 全局账号约束」与任何写稿流程。
- - **退出码 0 + 可选项警告**:流程**不阻断**,可直接进入下一步;不得要求用户先配置外部写作/图片模型。
- - **退出码 1(微信不完整)时**:只展示 [首次引导](references/first-time-setup.md) 中的 **配置选项**,**不要**在同一轮回复里再问「写哪篇 / 继续哪篇草稿 / 新选题」等;须等配置闭环(重跑校验通过或「本次例外」已书面确认)后,**再**进入下方 **「2) 全局账号约束」**。
- - **`validate_env.py` 不检查** `article_category`、`target_reader`、`default_author`;须在 **「2) 全局账号约束」** 中单独检查并落盘。
+ 按上文完成检测顺序,`validate_env.py` 退出码 0 且预设目录已建,才能进下一步。
- ### 2) 全局账号约束(`.aws-article/config.yaml`)⛔
+ - **退出码 0 + 可选项警告** → 不阻断,直接进下一步,不得要求用户先配写作/图片模型。
+ - **退出码 1**(微信不完整)→ 见 [branches.md 第三节](references/branches.md)。
+ - `validate_env.py` **不检查** `article_category` / `target_reader` / `default_author`,那三项在下一步查。
- **在 `validate_env.py` 已通过**(或已按总览完成「本次例外」)**之后、进入「3) 本篇准备」之前**,**必须**打开 **`.aws-article/config.yaml`**,检查下列键 **trim 后是否非空**:
+ ### 2) 全局账号约束 ⛔
- - **`article_category`**、**`target_reader`**、**`default_author`**
+ 打开 `.aws-article/config.yaml`,检查 **`article_category`、`target_reader`、`default_author`** trim 后是否非空。
- 任一项缺失或空白:**逐项询问用户**(1.账号领域2.目标读者3.作者名字),取得**用户当轮明确答复**后再**写回** **`.aws-article/config.yaml`**,再进入 **「3) 本篇准备」**。**禁止**仅在对话里口头确认却不写入文件。**禁止**跳过本步直接假定可写稿。
+ 三项齐全 → 静默通过,进下一步。任一为空 → 见 [branches.md 第四节](references/branches.md):逐项问用户、取得当轮答复后写回文件,**禁止擅自填写或从别处反推**。
- **⛔ 禁止擅自填写(必须写进行为约束)**
+ ### 3) 本篇准备
- - **不得**从本篇或其它目录的 **`article.yaml`**、历史草稿、**`topic-card.md`**、对话记忆或仓库内任意文件**静默抄录、推断或「顺手补全」**后写入 **`article_category` / `target_reader` / `default_author`**。对 **`tone`** 等与账号画像强相关的全局项,要直接询问用户,**同样禁止**未询问就写盘。
- - **允许的做法**:向用户说明「当前为空」,**请用户填写或确认**;若你想根据某篇 `article.yaml` 给**建议**,只能**展示为待选文案**,并问「是否采用 / 要改哪几个字」,**用户明确同意后再写入** `config.yaml`。
- - **顺序**:在尚未完成 **「3) 本篇准备」** 中「续旧 / 新开」的确认前,**禁止**用某一 `drafts/…/article.yaml` **反推**全局三键,避免误把单篇元数据当成整号定位。
+ **不了解用户要续写还是新开时,须先问**,再进入下面的步骤。**禁止**默认「最近修改」的目录、未确认就跑写作脚本、或假定沿用上一轮路径。
- ### 3) 本篇准备(二选一,默认「新建一篇」)
+ 用户直接给了 `drafts/…` 路径 → 走 [branches.md 第一节「我已有目录」](references/branches.md)。
- **在完成「2) 全局账号约束」之后**,**在不了解用户是要续写既有草稿还是新开一篇时**(例如未指定 `drafts/…` 路径、且仓库 **`drafts/`** 下存在进行中目录或多个候选):**须先询问**并让用户选定 **「继续哪一篇」** 或 **「新开一篇」**,**再**进入下列 A/B 或调用写作脚本。**禁止**默认「最近修改」目录、未确认就运行写作脚本、或假定沿用上一轮路径。
+ **涉及用户自身业务时**(产品 / 软件 / 服务):先 `ls .aws-article/products/` 看有无相关目录,有就必读根下 `*.md` 作底稿、优先复用 `images/` 里的现成配图;流程中产生的业务介绍类内容,主动引导用户存回 `.aws-article/products/{产品名}/`。详见 [assets skill](../aws-wechat-article-assets/SKILL.md)。
- **业务素材双向规则(涉及用户自身业务时强制,详见 [assets skill](../aws-wechat-article-assets/SKILL.md))**:
+ #### 新建一篇(严格子顺序,勿跳步)
- - **读**:若本篇涉及用户自家业务(产品/软件/服务),**先 `ls .aws-article/products/`** 看有无相关产品目录,进入后必读根下 `*.md`(业务介绍)作为底稿来源;`images/` 子目录里有现成业务配图则优先复用。
- - **写**:本流程中产生的内容若**语义属于业务介绍**(不是文章主体而是侧重产品/服务自介),由 AI 主动引导用户保存到 `.aws-article/products/{产品名}/{文件名}.md`(用 Write 工具直接落库;目录不存在时同时创建 `images/`),下次涉及业务的文章自动用上。
+ 1. **写作意图** ⛔ **BLOCKING**:必须问清**本篇要写什么**(主题、角度、体裁或目标)。用户只想「帮我出选题」时须**明确确认**后再按无方向模式处理。
+ ⛔ 用户未回答本步之前,**禁止** `web_search`、禁止执行 topics 的调研、禁止批量生成选题或标题。
+ 用户已在当次对话说清楚的,口头确认一句即可,不必重复盘问。
+ 2. **定题与 slug**:确定发文标题(用户从候选中选或自定义),据此生成 slug,目录名 `YYYYMMDD-标题slug`。
+ 3. **建目录与 `article.yaml`**:创建 `{drafts_root}/YYYYMMDD-标题slug/`(`drafts_root` 以 `config.yaml` 为准,默认 `drafts/`)。
+ ⛔ **必须用 `{baseDir}/../aws-wechat-article-publish/scripts/article_init.py` 初始化,不要手写。** 手写一定会漏字段——实测三篇连着漏掉 `image_medium`,配图媒介的「避开上一篇」因此永远查不到东西。
+ 4. **本篇预设单选落盘(必做)**:以 `config.yaml` 为来源,按 `custom_* > default_*` 结合本篇主题,为下列字段各选**单一预设**写回 `article.yaml` 为**单元素列表**:
+ `default_structure`、`default_closing_block`、`default_title_style`、`default_format_preset`、`default_format_scheme`、`default_cover_image_style`、`default_sticker_style`。
- #### A. 新建一篇(**严格子顺序**,勿跳步)
+ ⛔ **`default_article_image_style` 不在此列**,保持多元素候选池原样——正文形态是**每个图位各选一个**,收敛成一个等于整篇配图用同一种形态。实测三篇都被钉成「对比说明」,而实际三张图是实证、流程图、流程图。
- 1. **写作意图** ⛔ **BLOCKING**:必须问清用户 **本篇要写什么**(具体主题、角度、体裁或目标)。若用户只想「帮我出选题」,须**明确确认**后再当无方向模式处理。
- - **禁止**在用户未回答本步(且当前对话也未等价说明)之前:**调用 web_search**、**执行 topics 的调研**、**批量生成选题或标题**。
- - 用户已在当次对话中说清楚「写什么」的,可本步口头确认一句即可,不必重复盘问。
- 2. **定题与 slug**:在写作意图已明确的前提下,确定**发文章标题**——用户从候选中选一个,或**自定义标题**;据此生成 **slug**,目录名为 `YYYYMMDD-标题slug`(slug 规则:小写、连字符、与项目习惯一致即可)。
- 3. **建目录与 `article.yaml`**:创建 `{drafts_root}/YYYYMMDD-标题slug/`(`drafts_root` 以 **`config.yaml`** 为准,默认 `drafts/`)。随即初始化本篇 **`article.yaml`**(含 **`publish_completed: false`**,及标题、作者、摘要等;目录内**最先写入**)。
- - ⛔ **必须用 `{baseDir}/../aws-wechat-article-publish/scripts/article_init.py` 初始化,不要手写。** 手写一定会漏字段——实测三篇连着漏掉 `image_medium`,配图媒介的「避开上一篇」因此永远查不到东西,整个号的配图退化成随机。
- - **`publish_method`**:默认 **`draft`**;要发出去 → **`published`** 或 **`full --publish`**;用户明确不填微信 → **`none`**。
- 4. **本篇预设单选落盘(必做)**:初始化后按场景执行:**新建首轮**以 **`.aws-article/config.yaml`** 为来源,按 **`custom_* > default_*`** 结合本篇主题/选题卡,为以下字段各选**单一预设**并写回本篇 **`article.yaml`** 为**单元素列表**:`default_structure`、`default_closing_block`、`default_title_style`、`default_format_preset`、`default_format_scheme`、`default_cover_image_style`、`default_sticker_style`。
+ ⛔ **选模版与配色不要只看名字**:先跑 `format.py --list-themes`,按「适合 / 不适合」对本篇题材,再按配色说明选一档。**也不要连着几篇选同一套**——同一天发的几篇如果模版、配色、封面形态全同,读者一眼看出是套模板。开工前扫一眼最近几篇:
- - ⛔ **`default_article_image_style` 不在此列,保持多元素候选池原样。** 正文配图形态是**每个图位各选一个**(这一节讲流程用流程图,那一节讲数字用数据图表),由 [image-method 第二步](../aws-wechat-article-images/references/image-method.md) 逐位判断。收敛成一个等于让整篇所有配图都用同一种形态——实测三篇都被钉成「对比说明」,而实际三张图分别是实证、流程图、流程图,没有一张对得上。
- - ⛔ **选排版模版与配色时不要只看名字**:先跑 **`format.py --list-themes`**,按其中「适合 / 不适合」对本篇题材,再按配色说明选一档。**也不要连着几篇都选同一套。** 开工前先扫一眼最近几篇的 `article.yaml`,模版和配色都与上一篇不同——同一天发的几篇如果模版、配色、封面形态四个维度全同,读者一眼看出是同一个模板套出来的。
+ ```bash
+ grep -h "^default_format_preset:" -A1 $(ls -d drafts/*/ | sort -r | head -3 | sed 's#$#article.yaml#') 2>/dev/null
+ ```
- ```bash
- grep -h "^default_format_preset:" -A1 $(ls -d drafts/*/ | sort -r | head -3 | sed 's#$#article.yaml#') 2>/dev/null
- ```**续写/重入**时若本篇 `article.yaml` 对应字段已为单元素列表,视为本篇已选并优先保留,不重选不覆盖。若 `config.yaml` 不存在或候选为空,可保持 `[]`。
- 5. **脚本输出一律落盘 ⛔**:调本套件任何脚本时,把 stdout 与 stderr 一起重定向到本篇目录下的
- `<环节>.log`,不要只看屏幕。
+ 续写 / 重入的处理见 [branches.md 第五节](references/branches.md)。
+ 5. **脚本输出一律落盘 ⛔**:调本套件任何脚本都把 stdout 与 stderr 一起重定向到本篇目录下的 `<环节>.log`,不要只看屏幕。
```bash
{python} {baseDir}/../aws-wechat-article-images/scripts/image_create.py generate … \
> drafts/YYYYMMDD-slug/cover-generation.log 2>&1
```
- 约定文件名:`cover-generation.log`、`image-generation.log`、`format.log`、`publish.log`。
-
- 这些日志是出问题时唯一的凭据,而且**关键信息只在里面**:端点忽略比例把封面腰斩、
- 模版从哪个文件加载、配色有没有应用、正文图上传成了哪个 URL——屏幕上滚过去就没了。
- 实测靠 `cover-generation.log` 里那行「已按 2.35:1 居中裁切: 1024x1024 → 1024x436」
- 才定位到封面为什么难看;而最近一篇没留日志,同类问题就只能靠猜。
-
- 6. 至此才进入 **第 4 步内容流水线**。
-
- #### B. 我已有目录
-
- - 用户给出路径。必读 **`.aws-article/config.yaml`**(账号与发布策略);本篇目录内需有 **`article.yaml`**(或按用户状态后补)。若已有 `article.html`/`cover.jpg` 可直接从流水线中靠后的步骤接入。
- - 若用户意图是「发布后换图并重发草稿箱」,也走本分支:指定既有目录后,从 **配图(用户供图分支)** 接入,再执行 **终审 → 发布**。
-
- ### 4) 内容流水线(子 skill)
-
- 须已具备 **本篇目录** 与 **`article.yaml`**(「已有目录」分支按上条处理);账号侧约束以 **`config.yaml`** 为准。
+ 约定文件名:`cover-generation.log`、`image-generation.log`、`format.log`、`publish.log`。这些日志是出问题时唯一的凭据,**关键信息只在里面**——端点忽略比例把封面腰斩、模版从哪个文件加载、配色有没有应用、正文图传成了哪个 URL,屏幕上滚过去就没了。实测靠 `cover-generation.log` 里那行「已按 2.35:1 居中裁切: 1024x1024 → 1024x436」才定位到封面为什么难看。
- **确认轮次优化**:全局三键已非空时静默通过;`publish_method` 已为合法值时不重复盘问;多个待确认项可合并为一轮提问。用户意图明确时(如给出主题 + "写一篇文章"),理想轮次为 **1 轮**(确认标题/摘要)+ **写完后展示结果**。配图方案在用户无特殊要求时按默认风格自动执行,不单独确认。
+ ### 4) 内容流水线
```
选题 → 写稿 → 审稿(内容审) → 排版 → 配图 → 审稿(终审)
```
- - **topics**:仅在 **写作意图已明确**(见上 3-A-1)之后执行;仍须遵守 **aws-wechat-article-topics** 中「展示后等用户选」等规则。
- - **writing**:结合 **`.aws-article/config.yaml`** 与 `topic-card.md`(或用户素材);**`publish_method`** 见 **`config.yaml`**(上文「发布方式与时间线」);产物 `draft.md` → 内容审后 `article.md`。
- - **review(内容审)**:定稿 **`article.md` 前**须按 [review 第 5 步 ⛔ BLOCKING](../aws-wechat-article-review/SKILL.md) 完成文末 **`{embed:…}`**(或规则允许的省略并留痕);**未完成不得进入 formatting**。
- - **formatting**:`article.md` → `article.html`(用户当次指定排版主题可覆盖默认)。
- - **images**:按 **aws-wechat-article-images**(配置与行为约束以本节「配置检查」为准)。
- - **review(终审)**:检查 `article.html` 与 `imgs/`;有问题给出清单,等用户确认或修复。
-
- ### 5) 发布
-
- - 以 **`config.yaml`** 的 **`publish_method`** 为准;**`draft`** / **`published`** / **`none`** 含义见上文。**`none`** 时运行 **`full`** 会无操作退出。
- - **`draft`/`published`**:**微信**须配齐后再调 **`publish.py`**;建议 **`check-wechat-env`**。**`none`**:不调微信,说明即可。
- - 完成后输出小结与回执,目录按需移至 `published_root`。
-
- ### 6) 发布后换图重发(补充分支)
-
- 当用户说「草稿箱里图不满意,换我上传的图重新发」:
+ | 步骤 | 子 skill | 读取 | 产出 |
+ |------|---------|------|------|
+ | 选题 | [topics](../aws-wechat-article-topics/SKILL.md) | `config.yaml`、web_search | `topic-card.md` `research.md` |
+ | 写稿 | [writing](../aws-wechat-article-writing/SKILL.md) | `topic-card.md`、`config.yaml` | `draft.md` |
+ | 内容审 | [review](../aws-wechat-article-review/SKILL.md) | `draft.md`、`config.yaml` | `review.md` → `article.md` |
+ | 排版 | [formatting](../aws-wechat-article-formatting/SKILL.md) | `article.md`、`config.yaml` | `article.html` |
+ | 配图 | [images](../aws-wechat-article-images/SKILL.md) | `article.md`、`config.yaml` | `imgs/`、`cover.*` |
+ | 终审 | review | `article.html`、`imgs/` | `review.md` |
- 1. 锁定目标 `drafts/…` 目录;
- 2. 将新图放入本篇 `imgs/`,生成/更新 `img_analysis.md`(封面仅 1 张);
- - 同步更新本篇 `article.yaml`:`image_source: user`;
- - 开始重做流程前,将 `publish_completed` 置回 `false`;
- 3. 依据分析结果更新 `article.md` 图片映射(允许重排);
- 4. 重新执行 `format.py` 生成 `article.html`;
- 5. 终审通过后执行 `publish.py full`(`draft` 写草稿箱);
- 6. 发布命令成功且回执可用后,写回 `publish_completed: true`。
+ ⛔ **内容审产出的 `article.md` 定稿须先满足 [review 第 5 步](../aws-wechat-article-review/SKILL.md)(文末 `{embed:…}`,BLOCKING)再排版。**
- ## 流程
+ **topics / `web_search`** 须在 3-1(用户已说明写什么,或已确认只帮出选题)之后才可执行。
- ```
- 选题 → 写稿 → 审稿(内容审) → 排版 → 配图 → 审稿(终审) → 发布
- ```
+ **确认轮次**:全局三键非空时静默通过;`publish_method` 合法时不重复盘问;多个待确认项合并为一轮。用户意图明确时理想轮次为 **1 轮**(确认标题/摘要)+ 写完展示。配图在用户无特殊要求时按默认风格自动执行,不单独确认。
- ## 中间产物门禁(缺啥补啥)⛔
+ ### 5) 发布
- 进入下一步前,必须先检查本步所需中间产物;缺什么就先补什么,禁止跳步并宣称已完成。
+ 以 `config.yaml` 的 `publish_method` 为准:`draft` → `publish.py full` 只写草稿箱;`published` 或 `full --publish` → 再提交发布;`none` → `full` 无操作退出。
- | 阶段 | 必要产物(最小集合) | 缺失时动作 |
- |------|----------------------|------------|
- | 写稿完成 | `article.md` 存在且非空 | 继续写稿或回滚到 writing |
- | 排版完成 | `article.html` 存在,且由当前 `article.md` 重新生成 | 先执行 formatting 重转 |
- | 配图完成 | 文章目录存在 `cover.(png/jpg/jpeg/webp)`;`article.md` 与 `article.html` 不含 `placeholder` | 先执行 images 生成并替换(`image_source=user` 时走用户供图映射与重排) |
- | 发布就绪 | `article.yaml` 含 `title/author/digest/content_source`;发布环境检查通过 | 先补齐元数据或环境 |
- | 发布闭环 | 发布命令成功且回执可用 | 才允许写回 `publish_completed: true` |
+ 前两档需微信凭证配齐,建议先跑 `publish.py check-wechat-env`。完成后输出小结与回执,目录按需移至 `published_root`。
- **禁止**:仅凭单一信号(如“草稿创建成功”)就宣称全流程完成。若正文仍有 `placeholder`,状态必须标记为“草稿已提交,正文配图未完成”。
+ 用户说「草稿箱里图不满意要换图重发」→ 见 [branches.md 第二节](references/branches.md)。
- | 步骤 | 子 skill | 读取 | 产出 |
- |------|---------|------|------|
- | 选题 | topics | **`.aws-article/config.yaml`**、`aws.env`、web_search | `topic-card.md` `research.md` |
- | 写稿 | writing | `topic-card.md`、**`.aws-article/config.yaml`**、`aws.env`(专用写作 API) | `draft.md` |
- | 审稿 | review | `draft.md`、`aws.env`、**`.aws-article/config.yaml`** | `review.md` → `article.md`(定稿须含文末 embed,见 [review 第 5 步](../aws-wechat-article-review/SKILL.md)) |
- | 排版 | formatting | `article.md`、**`.aws-article/config.yaml`** | `article.html` |
- | 配图 | images | `article.md`、`aws.env`、**`.aws-article/config.yaml`** | `imgs/` |
- | 终审 | review | `article.html`、`imgs/`、**`.aws-article/config.yaml`** | `review.md` |
- | 发布 | publish | `article.html`+`imgs/`、**`config.yaml`**、`aws.env`(调用 publish.py 时) | 草稿 media_id / 发布 publish_id、URL、`out/` 记录 |
+ ## 中间产物门禁 ⛔
- **账号与文风约束**:以 **`.aws-article/config.yaml`** 为准。
+ 进入下一步前先检查本步所需产物;缺什么补什么,**禁止跳步并宣称已完成**。
- **topics / `web_search`**:须满足上文 **3-A-1**(用户已说明本篇写什么,或已确认「只帮忙出选题」)之后才可调研与生成选题;不得默认跳过提问直接搜索。
+ | 阶段 | 必要产物 | 缺失时 |
+ |------|---------|--------|
+ | 写稿完成 | `article.md` 存在且非空 | 继续写稿或回 writing |
+ | 排版完成 | `article.html` 存在,且由**当前** `article.md` 重新生成 | 先重跑 formatting |
+ | 配图完成 | 有 `cover.(png/jpg/jpeg/webp)`;`article.md` 与 `article.html` 都不含 `placeholder` | 先跑 images 生成并替换 |
+ | 发布就绪 | `article.yaml` 含 `title/author/digest/content_source`;发布环境检查通过 | 先补元数据或环境 |
+ | 发布闭环 | 发布命令成功**且回执可用** | 才允许写回 `publish_completed: true` |
- > 提示:发布前需就绪本篇 `article.yaml`(标题/作者/摘要/封面等元数据;`content_source` 默认 `article.html`)。可用 `{baseDir}/../aws-wechat-article-publish/scripts/article_init.py` 快速初始化或更新。
+ **禁止**仅凭单一信号(如「草稿创建成功」)就宣称全流程完成。正文仍有 `placeholder` 时,状态必须标记为「草稿已提交,正文配图未完成」。
## 路由
- **默认**:与长文发文相关时 **优先 main**,由本 skill 按步编排;不要因用户说了「写」「选题」「发」就跳过 main 直连子 skill。
+ **默认与长文发文相关时优先 main**,由本 skill 按步编排;不要因为用户说了「写」「选题」「发」就跳过 main 直连子 skill。
- **何时直连子 skill**(可跳过 main 入口):用户**明确只要该步产物**、且不隐含「从零到发出」整条链。例如:已有 `article.md` 只要排版;已有稿只要审稿清单;已有 `article.html`+`imgs/` 只要发布前检查或提交;已有选题卡只要扩写等。
+ **何时可直连子 skill**:用户**明确只要该步产物**且不隐含「从零到发出」整条链。
| 用户说法 | 路由到 |
|---------|--------|
- | 从0开始、从零、从头、一条龙、完整流程、帮我发一篇、发到公众号(含各前置步)、今天发什么/写什么好(要成文并发)、不确定从哪步开始 | **main** |
- | **只要**选题卡、标题、摘要、排期、系列策划(明确不做后续编排) | topics |
- | **只要**在已有选题/大纲/草稿上写稿、改写、润色、续写(明确不要全流程) | writing |
- | **只要**审稿/校对/合规清单(成稿或已定版 HTML) | review |
+ | 从0开始、一条龙、完整流程、帮我发一篇、发到公众号、今天写什么好(要成文并发)、不确定从哪步开始 | **main** |
| 「能不能发」且含代为发布、或要从稿到发出整条收尾 | **main** |
- | **只要**排版、换主题、转 HTML | formatting |
- | **只要**长文封面/正文配图(有正文或插图位) | images |
- | 贴图、图片消息、多图推送、九宫格(非长文图文链路) | **sticker** |
- | **只要**执行发布/提交/群发(已有约定产物) | publish |
-
- ## 运行模式
-
- ### 一条龙
-
- 用户说「一条龙」「完整流程」时启用。按 **交互顺序** 的 1→2→3→4→5 执行;**3-A** 内子步骤亦须逐步完成。流水线中每步完成后**暂停**等用户确认。审稿有 🔴 项时进入修改循环。
-
- ### 单步
-
- 用户**明确只要某一步**且已有对应输入产物(或声明不做全流程)时,可仅执行该步骤;若表述含糊、可能还要后续发文,仍从 **main** 问起或按一条龙拆步确认。
-
- ### 贴图
+ | **只要**选题卡 / 标题 / 摘要 / 排期 / 系列策划 | topics |
+ | **只要**在已有选题或草稿上写稿 / 改写 / 润色 / 续写 | writing |
+ | **只要**审稿 / 校对 / 合规清单 | review |
+ | **只要**排版 / 换主题 / 转 HTML | formatting |
+ | **只要**长文封面或正文配图 | images |
+ | **只要**执行发布 / 提交 / 群发 | publish |
+ | 贴图、图片消息、多图推送、九宫格 | **sticker** |
- 路由到独立的 **aws-wechat-sticker** skill。
+ 表述含糊、可能还要后续发文的,仍从 main 问起。单步子 skill 的边界见 [branches.md 第六节](references/branches.md)。
- ## 配置与自定义
+ ## 分支与补充规则
- - **`aws.env`**(仓库根,密钥)与 **`.aws-article/config.yaml`**(非密钥与模型/微信元数据及 **`publish_method`**):校验 **`{baseDir}/scripts/validate_env.py`**;`aws.env` 键名见 **`references/env.example.yaml`**
- - **`config.yaml` / `article.yaml` / `aws.env` 字段说明**:[references/articlescreening-schema.md](references/articlescreening-schema.md)
- - 发布前微信:**`{baseDir}/../aws-wechat-article-publish/scripts/publish.py check-wechat-env`**(仓库根执行,试换微信 **access_token**;凭证在 **`aws.env`**)
+ 不在主路径上的情况全部写在 [references/branches.md](references/branches.md):已有目录分支、发布后换图重发、退出码 1 的处理、全局三键为空时怎么问、续写重入的预设处理、单步子 skill 的边界。