Install
openclaw skills install @haiyangchenbj/content-publishing-suite-skillTurn a fact-checked and compliance-approved final Markdown draft into multi-channel publishing assets — WeChat article, LinkedIn post, standalone responsive...
openclaw skills install @haiyangchenbj/content-publishing-suite-skill将一篇已审核定稿稳定转换为多个渠道的发布物料,并生成入库记录。本 Skill 是发布编排层,不做事实核验、原创性复核或跨材料审计(那些由上游 Skill 负责),也不自动执行任何外部发布动作。
本文档中
{SKILL_DIR}自动替换为 Skill 实际安装路径。
07-final.md,或显式标记「已审核」的等价 Markdown),要求产出微信 / LinkedIn / 独立 HTML / 入库物料。draft:
path: # 已审核定稿 Markdown
title:
author:
date:
approval_gate: # 必须满足其一
final_check_json: # industry-deep-dive-pipeline 产物;需 Gate B approved、red-line hits 0、credential/privacy P0 0
reviewed_marker: false # 或定稿首部带 `状态: 已审核` / `reviewed: true` 且用户确认
channels: [wechat, linkedin, html, archive]
output_dir:
external_action: dry-run # 默认只生成不发送
read_only_upstream: true # 不引入上游未覆盖的新事实
必须满足其一,否则拒绝进入:
final-check.json(industry-deep-dive-pipeline 产物)且 Gate B: approved、red-line hits: 0、credential/privacy P0: 0;或状态: 已审核 或 reviewed: true 标记,并由用户在请求中确认"已审核"。下游若引入任何上游未覆盖的新事实,必须暂停并提示回退上游重新核验,不得静默发布。
| 渠道 | 产物 | 说明 |
|---|---|---|
| 微信长文 | wechat_snippet.html(可粘贴片段)+ wechat_preview.html(手机框预览) | 135 编辑器兼容内联样式;不自动建草稿 |
| 微信发图摘要 | wechat_summary_card.jpg(810×1080)+ wechat_summary_copy.md | 长文二次分发物料:主题图重排、摘要、关键词和原文链接占位;不替代长文封面 |
linkedin-post.md | hook + 正文 + 3-5 话题标签;中/英按目标读者 | |
| 独立 HTML | standalone.html | 响应式单页,含目录与参考链接 |
| 入库 | archive-ledger.json(本地)+ 可选 Notion 记录 | 标题/渠道/时间/状态;可选 page ID 写入并回读 |
摄入定稿 → 输入门禁 → 逐渠道生成物料 → 输出门禁(脚本校验)→ 生成 package-manifest → 入库台账 → 外部动作门禁(需确认才发送)
读取定稿 Markdown,确认满足输入门禁。记录标题、作者、日期、核心判断。未通过门禁立即停止。
references/wechat-style.md 将 Markdown 转为全内联 <section> HTML。标题 22px 居中、小标题 17px 加粗 #1a3a5c、正文 16px / 行高 1.8 / #333、关键句 <strong style="color:#1a3a5c;">、表格深蓝表头白字 + 斑马纹。文末必须加 <v2></v2>。绝不使用 <style>、<script>、外联 class、外层 <div> 容器。模板见 templates/wechat-snippet.html。tech-writing-pipeline,并以其 **6.1「公众号发图摘要卡:固定骨架,有限自适应」**作为唯一完整视觉规范;本 skill 只负责编排、交付与台账,不能用本段摘要替代 6.1。同步生成 wechat_summary_card.jpg(810×1080、3:4)和 wechat_summary_copy.md。卡片必须执行 A/B/C/D 四区、56px 左右安全边距、左对齐阅读路径、上暖下冷、三色上限、一个主体结构加一个对照状态、主题行与一条最多三行的核心判断;仅能在主题隐喻、主体位置、同系列色盘微调、主题行和核心判断五项中自适应。不得把 2.35:1 长文封面硬裁或复用。文案应保留长文的判断闭环,而不是只写一句口号;包含短摘要、关键词/Hashtags、【原文链接:待填】和后台使用说明。图片不预制公众号账号水印,平台上传后的自动标识即可。templates/linkedin-post.md,取核心判断作 hook,正文压缩到 200-300 字,末尾 3-5 个话题标签。无 Markdown、无内部备注、无未公开数据、无流程元信息。templates/standalone.html,生成响应式单页,含标题/作者/日期/目录/正文/参考链接。平涂风格、大量留白、绝对排除科技电路风、发光、数字网格。archive-ledger.json(不存在则新建),字段见 templates/archive-record.json。运行确定性脚本校验每个渠道文件是否满足格式合约:
python3 {SKILL_DIR}/scripts/validate_publish_output.py --package <output_dir> --enforce
P0 阻断(如微信缺 <section>/<v2>、含 <script>、HTML 无结构、台账缺字段);P1 提示(如 LinkedIn 超长)。脚本退出码 2 表示存在 P0。作者内部笔名清单通过环境变量 PUBLISH_PEN_NAMES(逗号分隔)传入,不硬编码。
python3 {SKILL_DIR}/scripts/build_publish_package.py \
--draft <定稿.md> \
--approved-gate <final-check.json 或 --approved 标志> \
--channels wechat,linkedin,html,archive \
--output <output_dir>
脚本产出各渠道文件、更新 archive-ledger.json、输出 package-manifest.json。
任何实际推送、经文章管理平台建草稿、写 Notion 的动作前,必须列出目标并取得用户确认。默认只生成不发送(--dry-run)。确认后才执行,且写后必须回读核验(Notion 用 page ID 写入、幂等键防重复)。
final-check.json approved 或无显式"已审核"标记)一律拒绝进入,不得代替上游做核验。<section> 包裹、文末带 <v2></v2>;禁止 <style>/<script>/外联 class/外层 <div>。PUBLISH_PEN_NAMES 读取用于拦截,不硬编码进本 Skill。--dry-run,必须先列目标并取得用户确认;写后必须回读核验。NOTION_TOKEN、库 ID 用 NOTION_DB_ID;文章管理平台经既有 MCP/连接器),绝不硬编码。summary_card 路径。tech-writing-pipeline 并逐项执行其 6.1;未加载或无法访问时,停止摘要卡制作并说明缺少的规范,不能凭本 skill 的简写规则自行补全。| Scenario | Action |
|---|---|
| 输入门禁不满足 | 停止;输出缺失项清单并提示先完成上游核验 |
| 输出门禁出现 P0(退出码 2) | 不生成 manifest;列出每条 P0 及所在文件,修复后重跑 |
| 下游发现上游未覆盖的新事实 | 暂停发布,回退上游重新核验,不得静默发布 |
| 外部写入失败 | 先重试一次并交叉验证;仍失败则保留本地台账、报告原因,不留半写状态 |
| 定稿含未解析的复杂内嵌内容(图表/带字图片) | 标记为不可解析,请求文本抽取或人工确认 |
| 目标渠道未指定 | 默认生成全部四渠道并提示 |
<output_dir>/
├── wechat_snippet.html
├── wechat_preview.html
├── wechat_summary_card.jpg
├── wechat_summary_copy.md
├── linkedin-post.md
├── standalone.html
├── archive-ledger.json # 追加式入库台账
└── package-manifest.json # 本次发布包清单(各文件路径 + 门禁结果)
gate 报告:P0/P1 列表;有 P0 时明确标注"未通过、禁止发布"。
| 资源 | 用途 |
|---|---|
references/wechat-style.md | 微信 135 内联样式规范、组件样式代码 |
references/channel-contracts.md | 各渠道输出格式合约(校验规则依据) |
templates/wechat-snippet.html | 微信片段模板 |
templates/linkedin-post.md | LinkedIn 帖子模板 |
templates/standalone.html | 独立 HTML 单页模板 |
templates/archive-record.json | 入库台账条目模板 |
templates/notion-mapping.example.json | Notion 映射样例(凭据走 NOTION_TOKEN 环境变量,库 ID 占位符不写真实值) |
scripts/build_publish_package.py | 组织产物、更新台账、输出 manifest |
scripts/validate_publish_output.py | 各渠道格式合约校验,输出 P0/P1 gate |
validate_publish_output.py --enforce,退出码 0(无 P0)。<section>、文末 <v2></v2>、无 <script>/<style>/外层 class。<!DOCTYPE html> 开头,无科技电路风/发光/数字网格。package-manifest.json 各渠道均生成,archive-ledger.json 已追加一条。<style>/外层 <div>,粘贴进 135 编辑器后样式被剥离。tech-writing-pipeline 的 6.1;发布套件不再作为摘要卡视觉规范的替代品。