content-forge/.claude/skills/write-article/SKILL.md

370 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: write-article
description: >
Generate articles from Obsidian vault topics, optimized for traffic pool entry
(click-through × dwell time × completion rate). Output: a publish-ready draft
in 02-drafts/ with complete frontmatter, passing 27-item quality gate
(material density + title + de-AI + completion rate).
USE WHEN: User wants to create new long-form content (tech blog, opinion piece,
tutorial, social post, lizi_kk-style article) from a structured topic in 01-topics/.
Trigger phrases: 写文章、写作、生成草稿、技术博客、观点文、教程、社交短文、
article、blog post、draft、人格写作、栗子KK风格。
DON'T USE WHEN:
- User wants to analyze/deconstruct existing content → use dao-analysis instead.
- User wants to review/critique an existing draft → use multi-review or /review instead.
- User wants to import an external draft into vault → use import-draft instead.
- User wants to load vault context → use my-world instead.
- User wants to edit an existing draft in 02-drafts/ → use obsidian CLI directly.
- User says "分析"、"拆解"、"审查"、"导入" without creation intent → not this skill.
---
# Write-ArticleObsidian 文章写作技能
## 目标
用统一流程产出**能进流量池**的可发布草稿。
核心公式:**点击率 × 停留时长 × 完读率 = 流量池入场券**。三项相乘,任一项为零则全盘归零。详见 `references/content-quality.md`
质量底线:
- 标题:候选 ≥5 个,评分 ≥18/25
- 去 AI 味:零容忍黑名单词汇,人味注入 ≥5 项
- 完读率Hook 前 3 句到位,段间钩子不断,结尾金句+CTA
## 路由规则Use when / Don't use when
Use this skill when:
- User wants to **create new content** from a topic brief in `01-topics/`
- User says "写文章"、"生成草稿"、"write an article"、"create a draft"
- User specifies a style (tech_blog, opinion, tutorial, social_short, lizi_kk)
- User provides source notes and wants a publish-ready draft
Do NOT use this skill when:
- User wants to **analyze** existing content (article, transcript, concept) → use `dao-analysis`
- User wants to **review/critique** a draft for quality → use `multi-review` or `/review` command
- User wants to **import** an external draft into the vault → use `import-draft`
- User wants to **load vault context** or see what's in the vault → use `my-world`
- User wants to **edit** an existing draft (fix typos, update sections) → use `obsidian` CLI directly
- User wants to **format** a draft for publishing → use `format-markdown` (baoyu skill)
Edge cases:
- "帮我把这篇笔记改写成文章" → **this skill** (creation from notes = write-article)
- "分析一下这篇文章为什么火" → **not this skill** (analysis = dao-analysis)
- "审查我的草稿" → **not this skill** (review = multi-review)
- "把 atomstorm 项目里的文章导入 vault" → **not this skill** (import = import-draft)
## 输入要求
必须提供:
- `topic`文章主题1 句话)
- `style``tech_blog` | `opinion` | `tutorial` | `social_short` | `lizi_kk`
- `audience`:目标读者
- `source_notes`:至少 1 个 Obsidian note 路径vault 相对路径)
- `tags`1-5 个标签
可选:
- `persona`:人格激活(`栗子KK`),深度扮演作者身份
- `intensity`:人格强度 `light` | `medium` | `heavy`(默认 medium
- `title`文章标题如未提供Step 3 强制生成候选)
- `slug`:文件 slug英文短横线
- `length_target`:目标字数或段落数
- `cta`:结尾行动建议
- `publish_channel`:发布渠道
- `material_sources`额外素材文件路径列表vault 相对路径),用于补充素材锚点
> **风格与人格联动**:当 `style: lizi_kk` 时,自动加载 vault 内 `templates/author-style-lizi-kk.md` 和 `personal-context/` 参考文章,无需额外指定参数。
**`style``persona` 交互矩阵**
| 组合 | 行为 |
|------|------|
| `style: lizi_kk``persona` | 仅应用风格模板(结构+语言特征),不深度扮演 |
| `persona: 栗子KK``style: lizi_kk` | 人格口吻叠加到所选风格上(如 tech_blog + 栗子KK 语气) |
| 两者都设置 | 完整集成:风格模板 + 人格深度扮演(推荐) |
## 强制工作流7 步,不得跳步)
### Step 1a读取素材
逐个读取 `source_notes` 中的笔记,并搜索 vault 中相关素材,确认事实边界。
```bash
# 必须先 cd 到 vault 目录CLAUDE.md §6.1 强制要求)
cd "${VAULT_PATH:-/home/kang/apps/content-forge/content-forge}"
# 读取指定源笔记
obsidian read path="<source_note_path_1>"
obsidian read path="<source_note_path_2>"
# 搜索 vault 中相关素材(关键词来自 topic
obsidian search query="<topic关键词>"
# 读取匹配的 personal-context/ 文章(亲历锚点来源)
obsidian read path="personal-context/<matching_article>.md"
# 读取匹配的 09-viral-examples/ 案例(案例/数据锚点来源)
obsidian read path="09-viral-examples/<matching_example>.md"
# 读取用户额外指定的素材(如有 material_sources 参数)
obsidian read path="<material_source_path>"
```
执行要求:
- `source_notes` 中每个路径都要读取。
- 主动搜索 vault 中与 topic 相关的素材(`personal-context/`、`00-inbox/`、`09-viral-examples/`)。
- 未读完素材前,禁止进入写作。
- 素材来源优先级见 `references/material-anchors.md` §2。
### Step 1b提取素材锚点
从 Step 1a 读取的所有素材中,提取四类素材锚点并输出素材脚手架。
详细规则见 `references/material-anchors.md`。核心约束:
- **总锚点 ≥3****Type A亲历≥1****Type B 或 C数据/案例≥1**
- 必须输出结构化素材脚手架(格式见 `references/material-anchors.md` §3
- 素材不足时输出 `[?] 素材不足:缺少 <具体类型>`**禁止进入 Step 2**
输出格式:
```
## 素材脚手架
### Type A 亲历锚点
1. [锚点描述] — 来源: [vault路径]
...
### Type B 数据锚点
1. [数据 + 来源归属] — 来源: [vault路径或URL]
...
### Type C 案例锚点
1. [命名实体 + 分析要点] — 来源: [vault路径或URL]
...
### Type D 观察锚点
1. [引用/对话 + 归属] — 来源: [vault路径]
...
### 统计
- 总锚点: X 个
- Type A: X 个 ✓/✗≥1
- Type B|C: X 个 ✓/✗≥1
- 判定: 通过 / [?] 素材不足
```
### Step 2激活人格可选
如果提供了 `persona` 参数,按 `references/personas.md` 激活对应人格。
**激活确认格式**
```
收到,创作者。'栗子KK' 人格已上线强度medium
> 风格预览说实话这个坑我踩了不下10次今天终于有空聊聊。
等待您的创作指令。
```
**人格参数**
- `persona`: 人格名称(目前支持 `栗子KK`
- `intensity`: `light` | `medium` | `heavy`(默认 medium
### Step 3标题工程
标题决定 80% 的点击率。**禁止只写一个标题直接用。**
完整流程见 `references/content-quality.md` §1。核心约束
- 生成 **≥5 个候选标题**,覆盖不同公式(经历+数字+痛点 / 成本+悬念+真相 / 反常识 / 99%+反差 / 身份锚定)
- 每个候选命中**五要素 ≥3 项**(第一人称"我"、具体数字、张力词、信息缺口、身份锚定)
- **评分 ≥18/25**5 维度 × 1-5 分:好奇心缺口、情绪冲击、身份共鸣、具体度、可信度)
- 标题 **≤35 字**(微信折叠阈值)
- 禁止学术腔、泛泛而谈、标题党
输出格式:
```
候选标题:
1. [标题] — 评分: XX/25 — 命中要素: [列表]
2. [标题] — 评分: XX/25 — 命中要素: [列表]
...
✦ 最终选定: [标题](原因: ...
```
### Step 4生成文章草稿
`references/writing-styles.md` 选择对应风格模板生成正文。
如果激活了人格,同时应用 `references/personas.md` 的人格设定。
**素材先行原则**(详见 `references/material-anchors.md` §4
- 正文必须围绕 Step 1b 的素材脚手架构建,每个主要论点必须锚定到具体素材。
- Hook 第 1 句必须直接包含 ≥1 素材锚点(优先 Type A 或 Type B。不是"前 3 句",是"第 1 句"——铺垫后置。
- 每个主要章节H2/编号段落)至少引用 ≥1 个锚点。
- 结尾回扣开头锚点,形成首尾呼应。
- 所有事实性断言必须追溯到素材锚点,或标记 `[?]` 待验证。
**风格联动规则**
-`style: lizi_kk` 时,必须额外通过 `obsidian read path="templates/author-style-lizi-kk.md"` 读取风格指南,并参考 `personal-context/` 目录的已发表文章(这些文件位于 vault 内,需在 vault 目录下执行 CLI
#### 4a. 去 AI 味(强制)
详细规则见 `references/content-quality.md` §2。核心执行项
- **黑名单零容忍**:开头/过渡/结尾废话出现即重写(完整黑名单见 §2.1
- **意义膨胀零容忍**:删除"里程碑意义"、"划时代"、"引领新范式"等空洞修饰§2.1
- **模糊引用零容忍**:所有"研究表明"、"业内人士"必须给出具体来源否则删除§2.1
- **打破 AI 结构**:段落长短交替(每连续 3 段必须有 ≥1 段 ≤2 句话、打破对称、语气变化、偶尔不完整句、禁止绕路表述§2.2
- **禁止抽象过度**:每个抽象观点后必须紧跟一个具体场景(含时间/地点/数字/工具名禁止连续两个以上的纯观点段落§2.2
- **禁止聚合清单**:禁止在结尾或独立章节使用"我的N个思考/感悟/总结"式编号列表洞察必须散布在正文中§2.2
- **人味注入 ≥5 项**:不规则段落、口语化、括号吐槽、具体数字、个人经历、反问句、混合情绪、刻意凌乱等(完整清单 12 项见 §2.3
- **二次审计**:门禁检查后,通读全文自问"哪里一眼看出 AI 写的"→列出→修复§2.4
#### 4b. 完读率优化(强制)
详细规则见 `references/content-quality.md` §3。核心执行项
- **前 3 句 Hook**:反直觉结论 / 真金白银 / 身份挑战 / 悬念制造(禁止背景介绍、自我介绍、目录式开头)
- **段间钩子**:每个 section 尾部制造"未完成感"
- **小标题有信息量**:不是"第一步"而是"第一步这个操作让90%的人栽跟头"
- **阅读节奏**:每 300-500 字视觉断点,每连续 3 段必须有 ≥1 段 ≤2 句话,代码块 ≤15 行
- **结尾工程**:回扣开头 + 金句 + 具体 CTA
执行要求:
- 只使用已读取素材中的事实。
- 观点必须有论证链,不得堆砌口号。
- 内容结构必须匹配所选风格的"结构"要求。
- 人格激活时,口吻必须符合人格的 `voice_signature``catchphrases`
### Step 5创建草稿文件
将 frontmatter + 正文一次性写入 `02-drafts/` 目录,减少 CLI 调用开销。
```bash
obsidian create path="02-drafts/<YYYY-MM-DD>-<slug>.md" content="---
id: '<YYYY-MM-DD>-<slug>'
title: '<title>'
slug: '<slug>'
status: draft
content_type: article
channels:
- wechat
- x
language: zh-CN
source_urls: []
assets: []
cover_image: ''
template: article
owner: content-forge
created_at: '<YYYY-MM-DD>T00:00:00+08:00'
updated_at: '<YYYY-MM-DD>T00:00:00+08:00'
style: '<style>'
audience: '<audience>'
tags:
- '<tag1>'
- '<tag2>'
source_notes:
- '<note1.md>'
---
<ARTICLE_BODY>"
```
执行要求:
- 目标目录必须是 `02-drafts/`
- 文件名必须包含日期前缀与 slug。
- frontmatter 必填字段对齐 CLAUDE.md §4.2id, title, slug, status, content_type, channels, language, source_urls, assets, cover_image, template, owner, created_at, updated_at
- 正文必须是 Markdown可直接发布或二次编辑。
### Step 6验证 frontmatter
创建完成后,回读文件确认 frontmatter 完整性。
```bash
obsidian read path="02-drafts/<YYYY-MM-DD>-<slug>.md"
```
如果回读发现 frontmatter 字段缺失或格式异常,使用 `property:set` 逐项修补:
```bash
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="<field>" value="<value>"
```
必填字段检查清单(对齐 CLAUDE.md §4.2
- `id`, `title`, `slug`, `status`, `content_type`, `channels`, `language`
- `source_urls`, `assets`, `cover_image`, `template`, `owner`
- `created_at`, `updated_at`
### Step 7质量检查
逐项验证并输出 `[✓]``[✗]`**任一项 `[✗]` 时停止交付并修复**。
完整门禁清单见 `references/content-quality.md` §4。
#### 基础门禁
- [ ] 所有 `source_notes` 已执行 `obsidian read`
- [ ] 草稿已通过 `obsidian create` 写入 `02-drafts/`
- [ ] frontmatter 必填字段完整Step 6 回读验证通过)
- [ ] 不存在事实捏造与无依据断言
#### 标题门禁§4.1
- [ ] 候选标题 ≥5 个
- [ ] 最终标题评分 ≥18/25命中五要素 ≥3 项
- [ ] 标题 ≤35 字
#### 去 AI 味门禁§4.2
- [ ] 前 50 字无黑名单词汇
- [ ] 无"首先...其次...最后"四段式
- [ ] 结尾无"综上所述/希望有帮助"
- [ ] 无意义膨胀词汇("里程碑意义"、"划时代"、"深远影响"
- [ ] 无模糊引用("业内人士表示"、"研究表明"须给出处)
- [ ] 相邻段落字数差异 >20%(至少 3 组)
- [ ] 人味注入清单命中 ≥5 项(含混合情绪/刻意凌乱)
- [ ] 二次审计通过(自问"哪里一眼看出AI"→ 无残留)
#### 完读率门禁§4.3
- [ ] 前 3 句完成 Hook
- [ ] 每个 section 尾部有段间钩子
- [ ] 小标题有信息量
- [ ] 每 300-500 字有视觉断点
- [ ] 结尾有金句 + 具体 CTA
- [ ] 全文无超过 15 行的代码块
#### 素材密度门禁§4.4
- [ ] 素材脚手架已在 Step 1b 输出,总锚点 ≥3
- [ ] 亲历锚点Type A≥1
- [ ] 数据/案例锚点Type B/C≥1
- [ ] 第 1 句包含 ≥1 素材锚点(非标题,正文首句)
- [ ] 每个主要章节引用 ≥1 锚点
- [ ] 无未标注来源的事实性断言(或已标 `[?]`
## 输出约束
- 输出仅包含文章草稿及必要元数据,不输出无关解释。
- 文章语言默认中文,除非用户显式要求其他语言。
- 禁止编造数据、案例、引文、实验结果。
- 未确认的事实必须标记 `[?]`,并明确缺失项。
- 结构必须符合所选风格规范(见 `references/writing-styles.md`)。
- 段落应可读,避免空泛套话与重复表达。
## 失败处理
- 缺少必要输入时,返回:`[?] 缺失输入:<字段名>`,并停止写入。
- `obsidian` 命令失败时,返回:`[✗] <命令> 失败:<错误信息>`,并停止后续步骤。
- 如果无法确定风格,默认使用 `tech_blog`,同时显式告知用户。
## 风格参考
- `references/material-anchors.md` — 素材锚点规范(四类锚点 + 脚手架 + 编织规则)
- `references/content-quality.md` — 流量池质量框架(标题工程 + 去AI味 + 完读率 + 素材密度)
- `references/writing-styles.md` — 5 种写作风格模板
- `references/personas.md` — 人格化配置栗子KK
- vault 内 `templates/author-style-lizi-kk.md` — 栗子KK 详细风格指南(通过 `obsidian read` 读取)
- vault 内 `personal-context/` — 已发表文章参考5 篇)