wechat-content-pipeline
GitHub编排微信公众号文章从选题、写作到草稿上传的完整流水线。支持自动抓热点或指定主题,强制去AI味与严格校验,最终生成指定账号草稿箱内容,不公开发布。
Trigger Scenarios
Install
npx skills add 843645440/wechat-skill --skill wechat-content-pipeline -g -y
SKILL.md
Frontmatter
{
"name": "wechat-content-pipeline",
"description": "编排中文微信公众号文章从给定选题或自动联网发现热点,到写作、来源留档、随机主题、原生 HTML 信息模块、确定性封面、严格校验和指定公众号草稿箱的完整流水线。用于外部 Agent 定时触发“自动抓热点并生成公众号草稿”,或用户要求将给定主题一条龙送入 A\/B 账号草稿箱时。本 Skill 不创建定时任务、不公开发布,也不等待人工确认后才创建草稿。"
}
微信公众号内容生产流水线
外部 Agent 负责触发时间;本 Skill 自动完成内容生产并以指定账号草稿箱为终点。
每次必读
- references/artifact-contract.md:工作区、产物和阶段状态。
- references/account-profiles.md:账号内容偏好。
- references/execution-recovery.md:失败降级和重试边界。
- 排障
job.json阶段失败(inline-visuals 降级、封面探针)时读 references/pipeline-failure-triage.md。 - 封面探针 / inline 壳字段 / 字数修范围速查:references/session-lessons-cover-inline.md。
- 没有给定主题时再读 references/hotspot-discovery.md。
- 写作时读
../wechat-tech-insight-writer/SKILL.md;信息计划读../wechat-inline-visuals/SKILL.md。 - 写完正文后、prepare 前必读 references/humanize-pass.md,并加载
humanizer-zh做一次去 AI 味。
项目根目录通常是本 Skill 向上三级。若结构变化,只向上查找同时含根 SKILL.md、scripts/validate_gzh_html.py 和 scripts/wechat_publish.py 的目录;找不到就停止。
不可绕过的运行契约
完整流水线只允许使用以下入口:
pipeline_job.py init/topic/show
pipeline_runtime.py begin/prepare/finish
pipeline_runtime.py 是排版、信息模块、封面、校验、预览、门禁和草稿上传的唯一编排器。不得为单篇文章新建 Python、JavaScript、Shell 或 HTML 渲染脚本;不得手工拼接主题组件、手写封面 JSON、直接调用内部渲染脚本或用其它 Skill 替代失败步骤。现有脚本失败时按规定降级或停止,不现场开发新实现。
Agent 只保留四类判断工作:
- 从可靠来源选择一个热点和写作角度。
- 生成一次
article.md与sources.md。 - 按
humanizer-zh+ references/humanize-pass.md 就地改写一次article.md去 AI 味(默认 strong,不得循环)。 - 生成一次
inline-visuals.json;失败后不再修正或重写。
主题、封面模板、标题分行、高亮词、HTML 组件、阶段计时、重试、门禁和上传全部交给固定脚本。不得调用图片模型或 AI 视觉检测。不得公开发布。
固定工作流
1. 初始化
python3 <PIPELINE_ROOT>/scripts/pipeline_job.py init \
--project-root <PROJECT_ROOT> --account <ACCOUNT> [--topic "给定主题"]
只使用 work/<account>/current/;新任务覆盖同账号旧临时产物,不建立文章历史目录。
2. 确定选题
触发请求有主题时直接使用。没有主题时,按热点规则联网检索并只记录一个最佳选题:
python3 <PIPELINE_ROOT>/scripts/pipeline_job.py stage \
--job <WORK_DIR>/job.json --name discover --status running
python3 <PIPELINE_ROOT>/scripts/pipeline_job.py topic \
--job <WORK_DIR>/job.json --value "最终选题" --source auto-hotspot
没有可靠热点时停止,不用旧闻、传闻或候选清单凑稿。
3. 写作和来源
先启动真实计时:
python3 <PIPELINE_ROOT>/scripts/pipeline_runtime.py begin \
--job <WORK_DIR>/job.json
按写作 Skill 一次生成:
article.md:唯一一级标题和完整正文。正文字数硬门禁 1500—4000(prepare机械统计可读字符,不含一级标题与空白);按已核实信息量在区间内取长短——信息密则写长,信息薄则写够下限,不为凑长重复观点,也不得交付短于 1500 的稿。sources.md:机构、标题、日期、链接及支撑事实,不进入正文。
标题不超过 32 字,必须包含可识别主体或对象、明确动作和现实落点。保持受影响最深人群视角。正文按写作 Skill 的内容表达契约直接使用语义 Markdown:可靠的多对象同口径数据写成表格,重要短语用少量 **加粗** 标记,排版器随后映射为当前主题的完整组件。
4. 去 AI 味(Humanizer-zh,写后、排版前)
写作完成后、调用 prepare 之前,加载 humanizer-zh,并严格按 references/humanize-pass.md 执行:
- 将
stages.humanize标为running。 - 只对
article.md做 一轮 去 AI 味就地覆盖;默认强度strong(用户明确要求时才用light/medium);不改sources.md,不新增事实。 - 改写后自检字数仍在 1500—4000;标题仍 ≤32 字;保留
##小标题与必要表格/加粗。 - 将
stages.humanize标为completed,detail 含intensity=strong(或实际档位)。
禁止跳过本步直接 prepare。禁止 humanize 后再做第二轮“润色/去 AI”。
5. 固定主题并交接唯一信息计划
python3 <PIPELINE_ROOT>/scripts/pipeline_runtime.py prepare \
--job <WORK_DIR>/job.json
该命令机械核验正文和来源(含 1500—4000 字数硬门禁)、完成写作计时、随机固定注册主题、稳定选择三套封面模板之一,并自动生成合法封面规格与当前主题的空 inline-visuals.json 壳(version/theme/modules)。读取命令返回的 theme、plan 与 plan_schema,按 wechat-inline-visuals 只写一次完整计划;即使 0 个模块也必须保留顶层三字段,不得只写 {"modules":[]}。没有自然适合的模块就沿用或写回当前主题的空计划;不要凑数量。
6. 一次完成排版到草稿
生产任务必须运行:
python3 <PIPELINE_ROOT>/scripts/pipeline_runtime.py finish \
--job <WORK_DIR>/job.json \
--config <PROJECT_ROOT>/wechat-accounts.json
该命令固定执行:
- 校验信息计划;失败立即覆盖为空计划,不重试。
- 一次生成完整旧主题骨架、语义 Markdown 组件与同主题信息模块,保留全部原文;主题不是单纯换色。
- 用 HTML/CSS 生成 1410×600 封面;单次硬超时 45 秒,不做人工或 AI 视觉审查,但渲染器必须执行确定性的内容探针,排除浏览器错误页、空白页和标题越界,不能只验证 PNG 签名与尺寸。技术故障只重试一次,随后使用账号默认封面或停止。
- 对正文执行零 ERROR、零 WARNING 严格校验并生成预览。
- 通过草稿门禁后只调用
send --action draft;微信瞬时网络错误最多重试一次。 - 校验账号、动作和
draft_media_id,状态变为drafted后结束。
开发测试才允许增加 --dry-run;它会走完整机械流程和草稿输入校验,但不连接微信 API。--skip-draft 仅用于故障诊断,不得用于定时生产。
失败和恢复
排障时先读 references/pipeline-failure-triage.md(按 job.json 阶段分诊字数门禁、inline-visuals、封面探针与草稿),浏览器/沙箱细节见 references/execution-recovery.md。
- 信息计划或插入失败:标记
skipped、degraded=true,以纯正文继续,不重试。 - 封面两次技术尝试均失败:有默认封面则继续,没有则门禁停止;不回退 AI 生图。
- 默认封面是账号级永久素材,不是本地图片路径:同一张兜底图用于多个公众号时,必须分别上传到每个账号的永久素材库,取得各自独立的
thumb_media_id,再写入该账号的default_thumb_media_id(或对应环境变量)。不得跨账号复用素材 ID。 - 上传前核验兜底图实际内容:确认有效图像、无浏览器错误页、无水印或损坏,并裁切为适合公众号封面的 1410×600;只检查文件存在和尺寸不够。
wechat_publish.py的优先级是显式--cover> 环境变量中的默认素材 ID > 配置中的default_thumb_media_id。专属封面有效时仍优先使用专属封面;只有专属封面技术失败才走兜底。- HTML 有任何错误、警告或占位符:停止草稿创建。
- 草稿成功后立即停止,不调用公开发布接口。
- 同一轮失败保留工作区;恢复时读取
job.json,不得重新随机主题或模板。
最终报告
只报告选题、主题、信息模块数量及是否降级、目标账号、各阶段 duration_ms、文章与预览路径和草稿结果。不要展示内部推理、密钥或 sources.md 内容。
完成核验(防假完成)
对外声称「已 drafted / 流水线已结束」之前,必须同时满足:
job.json的state为drafted(不是running)。stages.draft.status=completed,且draft-result.json含非空draft_media_id。- 磁盘存在本轮
article.md、article.html(或预览);封面为cover/cover.png或已明确默认封面兜底。
若只完成 discover/begin、工作区几乎只有 job.json、或 write 仍为 running:不得估算 duration、不得编造草稿 ID、不得写完成套话。Cron 会话退出成功 ≠ 草稿成功,以工作区与 job.json 为准。
中断后续跑
同账号 work/<account>/current/ 卡在 write/fact-check/humanize=running 且已有 topic 时:优先续跑——补 article.md+sources.md → humanize-zh 一轮 → prepare → 一次写 inline-visuals.json → finish。不要无故 init 清掉已核验选题,除非产物损坏或用户要求整轮重来。
Version History
- 8688fe0 Current 2026-07-22 09:39


