---
name: aws-wechat-article-writing
description: 公众号写稿｜长文写作｜文章润色｜改写续写 — 公众号长文 AI 写作，从话题或提纲生成完整初稿，支持改写、续写、润色、开头结尾优化，可调 DeepSeek / GPT / Claude 或由 Agent 代写。面向自媒体作者、公众号运营、品牌文案。触发词（**单独触发仅限对已有稿子的修改**）：「改写」「润色」「续写」「续一段」「往下写」「接着这段写」「重写开头」「改结尾」「调整语气」「这段润色下」「把这段改活泼点」「优化用词」「用 GPT 重写」「用 DeepSeek 重写」。新写一篇请走 aws-wechat-article-main（main 内部会调用本 skill 生成初稿）；需要多环节串联（写+审+排+配图+发）也走 main。
homepage: https://aiworkskills.cn
url: https://github.com/aiworkskills/wechat-article-skills
metadata:
  openclaw:
    requires:
      env:
        - WRITING_MODEL_API_KEY
      bins:
        - python3
    primaryEnv: aws.env
---

# 长文写作

**公众号长文 AI 写作引擎** —— 从提纲或话题生成完整初稿，支持改写、续写、润色，多模型可切。

> **套件说明** · 本 skill 属 `aws-wechat-article-*` 一条龙套件（共 9 个 slug，入口 `aws-wechat-article-main`）。跨 skill 的相对引用依赖同一 `skills/` 目录，建议一并 `clawhub install` 全套。源码：<https://github.com/aiworkskills/wechat-article-skills>

## 能力披露（Capabilities）

本 skill 调用 `write.py` 生成文章初稿，**会把文章内容发送给用户配置的 LLM 端点**：

- **凭证读取**：仓库根 `aws.env` 的 `WRITING_MODEL_API_KEY`
- **凭证外发**：该 key 以 `Authorization: Bearer <key>` 头**发送到** `config.yaml.writing_model.base_url` 配置的外部端点（DeepSeek / OpenAI / Anthropic 等 Chat Completions 兼容 API）。**请使用专用 key 并配置可信端点或内部代理**
- **内容外发**：Prompt 内含本篇 `article.yaml` / `topic-card.md` / 合并配置 / `--reference` 指定的参考文档全文 → 整体 POST 给上述端点
- **文件读（仓库内）**：`.aws-article/config.yaml`、本篇 `article.yaml`、`topic-card.md`、`.aws-article/products/{产品名}/*.md`
- **文件读（仓库外）**：仓库内 `.aws-article/` 缺失时从 `~/.aws-article/` 读 `writing-spec.md` 与 `presets/`（**只读预设，不读凭证**）
- **文件写**：仅本篇目录下 `draft.md`
- **shell**：仅 `{python} {baseDir}/scripts/write.py`

`write.py prompt` 子命令**只输出 prompt JSON 不调用 LLM**，由 Agent 代写 —— 不想把内容发给第三方时走这条。

## 路由

从零发文、一条龙、完整流程 → [aws-wechat-article-main](../aws-wechat-article-main/SKILL.md)。本 skill 单独触发仅限**已有稿子的修改**（改写 / 润色 / 续写）。

## 配置检查 ⛔

任何操作前先按 **[首次引导 · 检测顺序](../aws-wechat-article-main/references/first-time-setup.md)** 执行，通过后才继续（或用户明确书面确认「本次不检查」）。

**写作模型**：`writing_model`（`provider`、`base_url`、`model`）在 `.aws-article/config.yaml`；`WRITING_MODEL_API_KEY` 在仓库根 `aws.env`。键名对照 [env.example.yaml](../aws-wechat-article-main/references/env.example.yaml)。

环境检查未通过时，只按首次引导处理配置选项，**不要**在同一条回复里混入写稿、草稿路径或多草稿选择。须遵守 main 的**智能体行为约束**：未通过校验且未获用户明确「本次例外」时，不得默认改由当前 Agent 代写并假装流程完整。

## 工作流

```
写稿进度：
- [ ] 第0步：⛔ 首次引导 · 检测顺序
- [ ] 第1步：⛔ 全局账号三键非空
- [ ] 第2步：⛔ 续旧稿还是新稿（不了解时须先问）
- [ ] 第3步：读取本篇约束与写作规范
- [ ] 第4步：发布方式（publish_method）
- [ ] 第5步：确定输入与写作方式
- [ ] 第6步：写作
- [ ] 第7步：跑 check 自检
- [ ] 第8步：⛔ 展示并等待用户确认
```

### 第1步：全局账号三键 ⛔

打开 `.aws-article/config.yaml`，检查 `article_category`、`target_reader`、`default_author` 是否 **trim 后均非空**。任一项缺失：**逐项询问用户**，取得当轮明确答复后**写回该文件**。与 [main「2) 全局账号约束」](../aws-wechat-article-main/SKILL.md) 一致。

**须在续旧/新开询问之前完成。禁止**从 `article.yaml`、其它草稿或仓库文件静默推断并写盘；**禁止**只在对话里确认却不落盘。

### 第2步：续旧稿还是新稿 ⛔

**不清楚**用户要续写 `drafts/` 下某篇还是新开一篇时：**须先询问**（可列出候选目录），选定后再往下。用户已明确路径或意图（直接给出 `drafts/…`、或说「新开一篇」）时不再盘问。**禁止**未确认就调用写作脚本，也禁止自动选中某一 `drafts/…` 跑脚本。

**目录命名**：新开一篇必须为 `YYYYMMDD-标题slug`（如 `drafts/20260406-wechat-article-skills/`）。**禁止省略日期前缀**。

### 第3步：读取本篇约束

`write.py` 先读全局 `.aws-article/config.yaml`，再读本篇 `article.yaml`，把两边的键**叠成一张表**生成写作提示——**同一键两处都有时以本篇 `article.yaml` 为准**。字段分工见 [articlescreening-schema.md](../aws-wechat-article-main/references/articlescreening-schema.md)。

- **config.yaml**：文风、结构预设、禁用词、字数、`embeds` 等「写什么、怎么写」的顶层字段进入这张表。`writing_model` / `image_model` 两段只给脚本连 API 用，**不**整段放进写作说明。
- **article.yaml**：本篇标题、作者、摘要、`publish_completed` 等；重名键覆盖 config。`publish_completed` 新建时须为 `false`，由 [publish skill](../aws-wechat-article-publish/SKILL.md) 在发布结束后改为 `true`。

| 字段 | 用途 |
|------|------|
| `target_reader` | 读者画像 → 深度、用词、案例 |
| `tone` | 调性 → 语气与句式 |
| `writing_style` | 结构表达方式（口语/书面/故事/方法论等） |

**⛔ 关键字段不得空跑**：调用 `write.py`（或让 Agent 代写）前，确认合并后的 `article_category`、`target_reader` 非空，且 `default_author` 或本篇 `author` 非空。不满足则**暂停写稿**并实际写入文件——不要只用对话表格收集「读者」却不落盘。

**另加载** `.aws-article/writing-spec.md`（如有）。`default_structure` / `default_closing_block` 在本篇 `article.yaml` 中须为**单元素列表** `[名]` 或 `[]`；含多个候选、或需要了解预设加载优先级时，见 [branches.md「四、结构 / 文末预设的多候选处理」](references/branches.md)。

**业务资料库**：本篇涉及用户自身业务（对外介绍 / 教程 / 案例 / 自家安利）时，**必须**先 `ls .aws-article/products/` 并读相关产品根下的 `*.md`，已有同主题文档优先增量改写。两种写作方式各自怎么用（Agent 直写标路径 vs `write.py --reference`）、写后如何回写，见 [branches.md「三、业务资料库的两条用法」](references/branches.md)。与自身业务无关的主题不读、不强求。

### 第4步：发布意图

确认 `.aws-article/config.yaml` 的 `publish_method` 是 `draft`（默认）/ `published` / `none` 之一。**已是合法值时静默通过，不重复盘问**。三者含义与询问口径见 [branches.md「五、发布意图」](references/branches.md)。

### 第5步：确定输入与写作方式

**输入**：`topic-card.md` / 用户提供的提纲或素材 / 用户口述主题，且已按第 3 步完成业务资料库判断。

**写作方式（优先级）**：

1. **优先**：调用第三方模型 `write.py draft|rewrite|continue`（用法见 [usage.md](references/usage.md)）
2. **自动降级**：模型未配置（退出码 2）→ `write.py prompt <mode> <input>` 取提示词 JSON，Agent 按**相同提示词**写，**无须**「本次例外」
3. **故障降级**：调用失败（退出码 1）→ 见 [branches.md「一、退出码处理」](references/branches.md)

**必须告知用户当前用的是哪种**：

- `ℹ️ 使用 write.py 调用第三方模型（{model}）`
- `ℹ️ 写作模型未配置，本次由当前对话模型直接写稿（使用相同写作约束）`
- `ℹ️ 第三方 API 不可用，本次由当前对话模型代写（使用相同写作约束）` + 原因

### 第6步：写作

写作必须遵循第 3 步读到的 `target_reader`、`tone`、`writing_style`：深度与用词贴合读者，语气贴合调性，结构贴合文章风格。

`image_source: user`（用户供图）时不输出 `placeholder`，改用真实路径——细则见 [branches.md「二、用户供图分支」](references/branches.md)。

#### Markdown 语法（硬性）

链路是「**markdown 语法 → 按语法输出 → 渲染器排版**」。写错的标记不会报错——渲染照常完成，**读者会在正文里直接看见 `__加粗__`、`###### 六级`、`[^1]` 这类符号**。

| 要表达的 | 写法 | 说明 |
|---|---|---|
| 小标题 | `## 二级` `### 三级` | 井号后必须有空格。**不写 `# 一级`**——文章标题由公众号后台单独填 |
| 加粗 | `**加粗**` | 正文最主要的强调手段，规则见下 |
| 斜体 | `*斜体*` | 中文里慎用，斜体的中文字形不好看 |
| 链接 | `[文字](https://…)` | 必须有可点的锚文本 |
| 配图 | `![类型名：画面内容](路径 "图注")` | 图注写在引号里；不写引号就没有图注 |
| 无序列表 | `- 一项` | 减号后必须有空格 |
| 有序列表 | `1. 一项` | 只在**真有先后**时用；并列的几项用 `-` |
| 待办清单 | `- [ ]` `- [x]` | **少用**——只有真正的检查项才用 |
| 引用 | `> 引文` | 每行都要有 `>` |
| 表格 | `\| a \| b \|` + `\|---\|---\|` | 分隔行不能省 |
| 代码 | 行内 `` `x` ``；成块用三反引号围栏 | **不要**用四空格缩进 |
| 分隔 | `---` 独占一行 | 上下各留一个空行 |

**禁止**：输出 HTML 标签（`<br>` `<div>`）；`:::` 之类自定义块语法；四空格缩进代码块；Setext 式标题（`====` / `----`）；裸 URL 当正文。

#### 产出配额（不是可选项）

语法规则模型都照做，但没有配额就一处都不产出。真稿实测：金句卡 0/10 篇，正文段落内的加粗 0/5 篇——加粗全在列表标签里，读者在手机上一屏扫过去没有任何落点。以下与 `write.py` 系统提示中的配额区**逐条对应**，改一处须同改两处。

- **摘要** —— 第一个 `##` 之前写一段 `>` 引用，80–128 字，**且与 `article.yaml` 的摘要字段不是同一句话**（实测 7 篇逐字相同，读者同一段读两遍）。
- **加粗 = 划重点** —— 读者没时间读完两千字，加粗要让他只看这些就知道你说了什么。
  **验收标准：把全文的加粗按顺序抽出来连读，应该是一篇能独立看懂的缩写版。** 读起来像词云（「透明度 / 瓶颈 / 采用」）或像把段落重念一遍，都是挑错了。
  据此倒推：**每 100 字左右就该有一个落点**（手机上约 4–5 行），**连续 200 字不许一个都没有**——那是读者划过整整一屏还找不到重点。每个 `##` 小节至少一处，结尾段也要有；一段里最多两处；每处都要**能独立看懂**——数字连着它的意思（`**省 88% Token**`），判断连着它的对象（`**打断不等于撤销**`），术语连着它的定性（`**按问题找证据**`）。关键数字尽量覆盖到。**不要**加粗整句的概括，**不要**每段都加在首句同一位置。

  > **密度按字数算，不按段数。** 段是会伸缩的单位：`paragraph_preference` 写「短段为主」的账号一段 35 字，写「自然段为主」的一段 80 字。同一条「每 2–3 段一处」落到读者眼里差两倍多——实测两篇都报 `[OK]`，一篇每 40 字一处、另一篇每 194 字一处。读者感受到的是**划过多少屏才碰到下一个落点**。
- **三项以上的并列** —— 写成 `- **标签**：说明` 列表，不要压进一个长段落。即使段落偏好要求「完整自然段」，那管的是叙述段，枚举仍然用列表。
- **金句恰好一处** —— 最值得截图转发的那一句写成 `> 金句。 —— 出处`，排版会排成金句卡。写两处以上卡片就退化成装饰条；不写出处就是普通引用。
- **`---`** —— 需要一个明显转场时用，独占一行、上下各留空行。排版会换成本模版的分隔装饰。
- **段距** —— 段与段之间空**一行**。空两行或用两个空格换行都不需要，段距由版式控制。

#### 配图占位

`image_source` 不为 `user` 时，按 `image_density` 生成占位，格式 `![类型名：画面内容](placeholder)`，每个占位**独占一行**，**封面占位放在标题之前**。类型名与细则见 [structure-template.md](references/structure-template.md)「配图标记」。

密度词是本套件自造的，不能只把词丢给模型让它猜（实测五篇真稿，标记数每篇都少于 `##` 小节数）：

| `image_density` | 就是说 |
|---|---|
| 每节一图 | 每个 `##` 小节各配一张，不多不少 |
| 按需配图 | 只在文字讲不清的地方配（流程、对比、数据），其余不配 |
| 少图 | 全篇只配 1–2 张最关键的 |
| 多图 | 每 2–3 个自然段配一张 |

**这是硬配额不是参考值**，写完自己数一遍。同一张表在 `write.py` 的 `_DENSITY_RULES` 与 [image-method.md](../aws-wechat-article-images/references/image-method.md) 里各有一份，措辞须一致。未配置时默认**每节一图**。

### 第7步：跑 check 自检 ⛔

`draft.md` 写完后**跑一遍脚本**，不合格先补再往下走。这些实测最容易漏，而且漏了不报错、只是版式悄悄少一块：

```bash
{python} {baseDir}/scripts/write.py check drafts/YYYYMMDD-slug/draft.md
```

它按上面的产出配额逐条量，并把**全文的加粗抽出来串成一行**打印——验收标准就是**这一串读起来像不像一份提要**，串不起来说明挑错了，不是数量不够。退出码非 0 表示有硬性项没达标。脚本只量数得出来的部分，**加粗挑得对不对仍要自己读一遍那一串**。

脚本管不到的两项，手工核对：

- **配图占位数**与 `image_density` 是否一致，格式是否合法；
- 禁用词、段落长度、开头吸睛度、小标题密度的**粗扫**。

⛔ 这一步**不**替代 [review skill](../aws-wechat-article-review/SKILL.md)：合规、敏感词、文末 embed、引用标注剥离都归 review，本步禁止越界。

续写时的中间产物门禁见 [branches.md「七」](references/branches.md)。

### 第8步：展示并等待用户确认 ⛔

向用户展示 `draft.md`，确认后**移交 [review skill](../aws-wechat-article-review/SKILL.md) 做内容审**。

**⛔ 产物边界**：本 skill 产出**只到 `draft.md`**。禁止在 writing 阶段：

- 自行写入 `article.md`（那是 review 第 5 步的 BLOCKING 产物，须含文末 `{embed:…}` 且已剥离引用标注）
- 自行剥离 `（资料路径：…）` 引用标注（由 review 调 `write.py strip-citations` 完成）
- 跳过 review 直接进入 [formatting](../aws-wechat-article-formatting/SKILL.md)

## 分支与异常

退出码四分类、用户供图、业务资料库细则、预设多候选、发布意图口径、确认轮次优化、续写门禁 → [references/branches.md](references/branches.md)。

## 过程文件

| 读取 | 产出 |
|------|------|
| `topic-card.md`、`.aws-article/config.yaml`、本篇 `article.yaml` | `draft.md`（含配图标记）；可能更新 `publish_method`；新建/补全 `article.yaml` 时保持 `publish_completed: false` |
