公众号长文 AI 写作引擎 —— 从提纲或话题生成完整初稿,支持改写、续写、润色,多模型可切。
套件说明 · 本 skill 属
aws-wechat-article-*一条龙套件(共 9 个 slug,入口aws-wechat-article-main)。跨 skill 的相对引用依赖同一skills/目录,建议一并clawhub install全套。源码: https://github.com/aiworkskills/wechat-article-skills
本 skill 调用 write.py 生成文章初稿, 会把文章内容发送给用户配置的 LLM 端点。使用前请阅读以下全部行为说明:
write.py 读取仓库根 aws.env 的 WRITING_MODEL_API_KEYAuthorization: Bearer <key> 头 发送到 用户在 config.yaml.writing_model.base_url 配置的外部端点(常见为 DeepSeek / OpenAI / Anthropic 等 Chat Completions 兼容 API)。 请使用专用 key 并配置可信端点或内部代理article.yaml / topic-card.md / 合并配置 / 用户通过 --reference 指定的参考文档 .md 全文 → 整体 POST 给上述端点.aws-article/config.yaml、本篇 article.yaml、 topic-card.md、 .aws-article/products/{产品名}/*.md(业务介绍 .md,直接挂在产品根).aws-article/ 缺失, write.py 会从用户家目录 ~/.aws-article/ 读取 writing-spec.md 与 presets/( 只读预设,不读凭证)draft.md、 article.md{python} {baseDir}/scripts/write.py( {python} = 本机 Python 3 解释器,见 main SKILL 第 0 步:Windows 用 py -3 -X utf8,macOS / Linux 用 python3)可使用 write.py prompt 子命令 只输出 prompt JSON 不调用 LLM,由 Agent 代写 —— 想避免把内容发给第三方时用这条路径。
本 skill 是 aws-wechat-article-* 一条龙公众号套件的 写稿环节(入口 aws-wechat-article-main)。工作流中的若干步骤会读取同级 ../aws-wechat-article-main/references/*.md 等共享文档(首次引导、env/config 示例、articlescreening schema 等)。
skills/ 根目录 时,跨 skill 引用都能读到。file not found;本 skill 内的纯本地步骤仍可用。完整 9 slug 清单见 源码仓库。
从零发文、一条龙、完整流程 → aws-wechat-article-main。
任何操作执行前, 必须 按 首次引导 执行其中的 「检测顺序」。检测通过后才能进行以下操作(或用户明确书面确认「本次不检查」):
从选题到发布的 前置规则(阻断、禁止擅自降级、「本次例外」等)见 aws-wechat-article-main/SKILL.md;本 skill 只描述写稿步骤。
写作模型: writing_model( provider、 base_url、 model 等)在 .aws-article/config.yaml; WRITING_MODEL_API_KEY 在仓库根 aws.env。键名对照 {baseDir}/../aws-wechat-article-main/references/env.example.yaml。
交互约定:须遵守 main 的 智能体行为约束—— 未 通过环境校验且 未 获用户明确「本次例外」时,不得默认改由当前 Agent 代写并假装流程完整。 环境检查未通过时,只按 首次引导 处理配置选项, 不要 在同一条回复里混入写稿、草稿路径或多草稿选择;配置闭环后再进入本 skill 工作流。
text
写稿进度:
- [ ] 第0步:⛔ [首次引导 · 检测顺序](../aws-wechat-article-main/references/first-time-setup.md)
- [ ] 第1步:⛔ **`.aws-article/config.yaml`** 中 **`article_category`**、**`target_reader`**、**`default_author`**(trim 后)须**均非空**;缺则**逐项问用户**、用户确认后再**写回文件**;**禁止**从 **`article.yaml`** 等擅自抄录(与 [main](../aws-wechat-article-main/SKILL.md)「2) 全局账号约束」一致);**须先于**续旧/新开
- [ ] 第2步:⛔ **在不了解**用户要**续写既有草稿**还是**新开一篇**时,**须先询问**并确定本篇 `drafts/…` 目录,**再**进入以下步骤;**禁止**未确认就调用写作脚本(见 [main](../aws-wechat-article-main/SKILL.md)「3) 本篇准备」开头)
- [ ] 第3步:读取本篇约束与写作规范;**写稿前先按下文「业务资料库」判断是否查阅/是否传 `--reference`**
- [ ] 第4步:发布方式(`publish_method`)⛔
- [ ] 第5步:确定输入与写作方式
- [ ] 第6步:写作
- [ ] 第7步:自检与修正
- [ ] 第8步:展示并等待用户确认 ⛔
说明:第 2 步在用户 已明确 路径或意图(例如直接给出 drafts/…、或明确说「新开一篇」)时可 不再重复盘问。
多草稿 / 未闭环:与第 2 步同原则—— 不了解 续写/新开时 须先问, 禁止 自动选中某一 drafts/… 跑写作脚本。
以下步骤可 合并或静默通过 以减少交互轮次:
article_category、 target_reader、 default_author 已非空 → 静默通过,无需再确认。draft/ published/ none(合法值)→ 静默通过(规则第3条已允许)。最少轮次:用户意图明确时(如给出主题 + "写一篇文章"),理想轮次为 1 轮(确认标题/摘要)+ 写完后展示结果。
.aws-article/config.yaml)⛔#在续旧/新开询问之前,打开 .aws-article/config.yaml,检查 article_category、 target_reader、 default_author 是否 trim 后均非空。任一项缺失: 逐项询问用户,取得 用户当轮明确答复 后再 写回该文件,再进入第 2 步。 禁止 从 article.yaml、其它草稿或仓库文件 静默推断并写盘;可把从某文件读到的内容 仅作建议展示,须用户同意后再写入。 禁止 跳过本步。 禁止 仅在对话里确认却不落盘。与 main「2) 全局账号约束」一致。
当不清楚 用户是要 续写 drafts/ 下某篇进行中草稿 还是 新开一篇 时: 须先询问(可列出候选目录),待用户选定后再进入第 3 步。 须在第 1 步全局三键已落盘之后执行。 已明确 时跳过本步询问。
目录命名:新开一篇时,目录名 必须 为 YYYYMMDD-标题slug(如 drafts/20260406-wechat-article-skills/)。 YYYYMMDD 为当日日期, slug 为小写、连字符分隔的标题缩写。 禁止省略日期前缀。
⛔ 关键字段不得空跑:在调用 write.py 或按合并约束让 Agent 代写之前,确认合并后的 article_category、 target_reader 均为非空字符串(trim 后); default_author 非空 或 本篇 article.yaml 的 author 非空。若任一项不满足, 须暂停写稿,引导用户补全 .aws-article/config.yaml(及/或本篇 article.yaml), 并实际写入文件—— 不要 仅用对话表格收集「读者」却不落盘。全局三键的优先检查顺序见 main「2) 全局账号约束」;若第 1 步已正确落盘,此处多为合并 article.yaml 覆盖 后的复核。
约束从哪来: write.py 会先读全局 .aws-article/config.yaml,再读本篇目录下的 article.yaml,把两边的键 叠成一张表 用来生成写作提示—— 若同一键在两份文件里都有,以本篇 article.yaml 为准。字段分工见 articlescreening-schema.md。
.aws-article/config.yaml: 文风、结构预设、禁用词、字数、 embeds 等 与「写什么、怎么写」有关的顶层字段会进入这张表。
writing_model / image_model 两段只给脚本 连 API 用(地址、模型名等), 不 整段放进给大模型的「写作说明」里,以免把技术配置当成正文要求。
本篇 article.yaml:本篇标题、作者、摘要、 publish_completed 等;与 config 重名的键 会 覆盖 config。
write.py 在仓库根执行,按 输入 .md 所在目录 找到本篇 article.yaml;叠完后的约束表不能为空(一般只要 config.yaml 里已有账号/文风等即可)。 publish_completed:新建或补全本篇 article.yaml 时须为 false;本篇发布真正结束后由 publish skill 改为 true; publish.py 不修改此字段。
default_structure / default_closing_block 指向的 预设正文 来自 .aws-article/presets/(及用户目录下同名 presets),与配置中的 文件主名 对应。两者在本篇 article.yaml 中必须为 单元素列表 [名](或空列表 []); write.py 对预设选择仅读取本篇 article.yaml,不再在执行阶段从 custom_* / default_* 候选池推断。
多候选自动选择:当 default_structure(或 default_closing_block)含 多个候选 时,Agent 须:
.aws-article/presets/structures/<名>.md),了解其适用场景;article.yaml 同键为单元素列表 [名];write.py。
禁止 盲选第一个——须基于内容匹配。若无法判断,向用户展示候选及说明后请用户选择。另加载 .aws-article/writing-spec.md(如有)。
字段用途target_reader读者画像 → 深度、用词、案例tone调性 → 语气与句式writing_style结构表达方式(口语/书面/故事/方法论等)
配置中其它与写稿相关的键(如 topic_direction、 forbidden_words、 heading_density、 target_word_count)一并写入约束。
目的: .aws-article/products/{产品名}/ 是用户业务(产品/软件/服务)的原始资料库——业务介绍 .md 直接挂在产品根(如 项目介绍.md), images/ 子目录存业务配图。
触发口径:
ls .aws-article/products/,对相关产品根下的 *.md 必读,已有同主题文档 优先增量改写 而非另起炉灶。写作只有 两种方式,业务资料用法如下(二选一,勿混用同一条命令里的职责)。
ls .aws-article/products/;若本篇涉及某产品业务, 必读 该产品根下相关 *.md。draft.md:凡正文中 实际引用或依据 了某份业务介绍的,在 该处表述之后 用括号附上 该文件的仓库相对路径(路径须真实存在); 未引用则不必加括号。image_source 不为 user(合并 config.yaml + 本篇 article.yaml)时,按 image_density 生成配图占位;若未配置或为空,默认 每节一图。格式必须为 ,每个占位 独占一行, 封面 占位放在 标题之前;类型名与细则见 references/structure-template.md「配图标记」。article.md:本 skill 产物 只到 draft.md,括号路径 保留在 draft.md 中 用于事实溯源。 article.md 是 review skill 第 5 步 的产物,由 review 调用 write.py strip-citations <draft.md> -o <临时文件> 自动剥离括号路径,再追加文末 {embed:…} 后写入。 writing 阶段禁止 自行命名 article.md、自行剥离括号路径、或假装"自检"等同于审稿。write.py 写稿ls .aws-article/products/,判断是否有相关产品的业务介绍 .md。write.py 时传入 --reference <路径>(可重复, 最多 5 个;路径须形如 .aws-article/products/<产品名>/<文件名>.md—— 直接挂在产品根, 不接受 images/ 子目录下的图片说明 .md,详见脚本与 usage)。脚本将全文注入系统提示「参考资料库」,并约定模型在依据处标注资料路径。--reference,仅靠选题卡与合并配置写稿即可。--reference 篇数或换更短文档后重试。写后识别(双向回写):若本次写作产生的内容 语义属于用户业务介绍(不是文章主体而是侧重产品/服务自介),按 assets skill 一、业务介绍 .md 入库 引导用户保存到 .aws-article/products/{产品名}/,下次写涉及业务的文章会自动用上。
禁止:将与主题无关的文档硬塞进正文;伪造业务资料中不存在的事实。
publish_method)⛔#在 调用 write.py 或进入第6步写作之前,确认 .aws-article/config.yaml 中的 publish_method(与 发布 skill、articlescreening-schema.md 一致):
取值含义(向用户说明时用 plain 语言)draft( 默认)定稿后若走 publish.py full,只把图文写入 公众号草稿箱,不自动「发出去」。**published定稿后 publish.py full 会在创建草稿后 再提交发布(异步)。也可用 full --publish 单次强制带发布。none**询问微信配置后用户 明确不想填写:写入 publish_method: none。 publish.py full 会 直接跳过、不调微信;写稿/审稿/排版等照常。
规则:
publish_method: draft,除非用户 明确要对外发布 → 改为 published; 明确不填微信、不走上传 → 改为 none。aws.env;用户拒绝填写 → none,不要代跑 publish.py full(跑了也会无操作退出)。draft / published / none(小写):可 不重复盘问。禁止:在 publish_method 非法 时调用 write.py;禁止未经同意默认 published。
输入: topic-card.md / 用户提供的提纲或素材 / 用户口述主题; 并已按上文「说明文档资源库」完成判断(直接写稿则已决定是否引用;走 write.py 则已决定是否传 --reference)。
写作方式(优先级):
write.py draft/rewrite/continue)— 依赖 config.yaml 的 writing_model + aws.env 的 WRITING_MODEL_API_KEY(见 usage.md)write.py prompt <mode> <input> 获取提示词 JSON,再由 Agent 按 相同提示词 直接写, 无须「本次例外」确认必须告知用户当前使用的方式:
ℹ️ 使用 write.py 调用第三方模型({model})ℹ️ 写作模型未配置,本次由当前对话模型直接写稿(使用相同写作约束)ℹ️ 第三方 API 不可用,本次由当前对话模型代写(使用相同写作约束),并说明原因write.py 退出码处理(智能体必选分支)#运行脚本后 须把终端里的具体报错原样摘要给用户(或引用关键行),勿只说「调用失败」。
按 退出码与报错类型 分支处理:
类型判断线索智能体动作**未配置(退出码 2)**stderr 含 [NO_MODEL]自动降级:运行 write.py prompt <mode> <input> 获取提示词 JSON( {"system_prompt": "...", "user_prompt": "..."})→ Agent 按该 system_prompt 和 user_prompt 写文章 → 输出到 -o 指定路径或展示给用户。 无须 用户确认或「本次例外」。网络类(退出码 1)超时、连接失败、 URLError、 网络错误:、临时性 502/503 等必须自动再试 1 次(可简短等待后重跑同一命令,并告知用户「正在重试」)。 第二次仍为网络类失败 → 改用 write.py prompt 获取提示词后由 Agent 按相同约束代写; 必须明确告知:第三方 API 网络不可用,本次由对话模型代写。配置/凭证类(退出码 1)401/403、Key 无效、 未找到写作约束、YAML 解析失败等不要 为「省事」自动降级掩盖问题。 列出须检查项( config.yaml 的 writing_model、 aws.env 的 WRITING_MODEL_API_KEY、本篇目录是否有 article.yaml 等),请用户修正后重跑 write.py。若用户 明确打字 愿意本次改由 Agent 代写,再按 main「本次例外」处理并留痕。**业务/内容类(退出码 1)**4xx 中除鉴权外(如 400 参数)、模型返回空等将 API 返回体摘要给用户;可先根据提示改 model / 请求参数再试一次;仍失败则与用户商定是否 Agent 代写。
Agent 代写时提示词获取:无论哪种降级路径,Agent 代写前都应先运行 write.py prompt <mode> <input>( --instruction 按需传入),取回与 write.py 调第三方模型时 完全相同 的 system_prompt 和 user_prompt,确保写作约束一致。
禁止:配置明显错误时静默改用 Agent 写稿却不说明;网络降级后不告知用户「本次未走第三方模型」。
写作时 必须遵循第3步读取的 target_reader、 tone、 writing_style(来自合并后的约束):深度与用词贴合读者,语气贴合调性,结构与表达方式贴合文章风格。
用户供图分支( image_source: user):
imgs/;随后由智能体 读图分析 并生成或补全 img_analysis.md(可用 user_image_prepare.py 先生成模板再填写)。 未落盘 img_analysis.md 不得调用 write.py,否则脚本会报错退出。img_analysis.md 是写稿时配图与章节顺序的 唯一依据: write.py 会把它并入提示,按「建议章节 / 推荐用途」把每张图放到合理位置(可重排章节以匹配叙事)。img_analysis.md 中“推荐用途:封面” 必须且只能有 1 处;否则不得写稿。imgs/xxx.png),不再输出 placeholder。image_source 只允许: generated / user。 禁止写 user_provided。generated;进入用户供图替换流程时写为 user。状态切换规则( article.yaml):
image_source: generated、 publish_completed: false。image_source 改为 user,并将 publish_completed 置回 false(表示需重新发布闭环)。publish_completed: true。文章结构:按优先级加载结构预设:
article.yaml 的 default_structure(单元素列表).aws-article/presets/structures/ 下的文件文末区块:按优先级加载:
article.yaml 的 default_closing_block 指定的文件(单元素列表)closing_block 非空字符串(若有)---\n觉得有用?点个关注,持续获取优质内容。默认模式下,写作时在需要图的位置插入配图标记 (规则见 write.py 系统提示与 references/structure-template.md「配图标记」)。
调用第三方模型 时的脚本用法: references/usage.md
仅做 粗扫:禁用词、段落长度、开头吸睛度、小标题密度,发现明显问题自动修正。 不 替代 review skill 的内容审 —— 完整的合规、敏感词、文末 embed、引用标注剥离均归 review 处理;本步禁止越界做 review 的工作。
配图占位自检(默认模式):当 image_source != user 时,核对 draft.md 是否满足 image_density(未配置则按 每节一图);缺失或格式不合法时,先补齐/修正  再进入审稿或配图步骤。
续写补充(中间产物门禁):
 时,必须把该占位计入“待配图清单”(供 images 步骤生成与替换)。article.md / article.html 若仍含 placeholder,只能标记为“正文配图未完成”,禁止宣称发布闭环完成。向用户展示 draft.md,确认后 移交 review skill 做内容审。
⛔ 产物边界(硬性):本 skill 产出 只到 draft.md。 禁止 在 writing 阶段:
article.md( article.md 是 review 第 5 步 ⛔ BLOCKING 的产物,须含文末 {embed:…} 且已剥离引用标注)(资料路径:...) 引用标注(剥离动作由 review 调用 write.py strip-citations 完成)读取产出topic-card.md、 .aws-article/config.yaml、本篇 article.yamldraft.md(含配图标记); 本 skill 可能更新 publish_method(发出去 → published;不填微信 → none;默认 draft);新建/补全 article.yaml 时保持 publish_completed: false