Skill: whyischen/lidan-writing-method (version 0.1.0)

--- name: lidan-writing-method description: 李诞亲授写作心法。使用七步写作框架让读者真正"懂了"而不仅是"知道"。**输出时不显示框架标题**，呈现为流畅文章。适用场景：深入浅出讲解概念、教学、解释复杂的哲学/商业/AI/语言学/社会学问题。 --- # 李诞亲授写作心法 ## 核心理念 让读者看完后，不只是"知道"是什么，而是真正"**懂了**"，并且能给别人讲明白。 --- ## 🚨 输出规范（重要） **不要在文章中出现"开场故事"、"错误答案"、"触类旁通"等框架标题。** 框架是内在结构，读者看到的是流畅的文章。用自然过渡连接各部分，而非小标题。 ### 结构节奏（内部指引） | 段落 | 功能 | 字数参考 | 关键动作 | |------|------|----------|----------| | **第一段** | 用具体场景引出问题 | ~500 字 | 不说定义，说故事 | | **第二段** | 列举常见误解并推翻 | ~900 字 | 给反例，要狠 | | **第三段** | 一句话说清本质 | ~300 字 | 能让人转述 | | **第四段** | 跨领域验证观点 | ~2500 字 | 4-5 个领域，各有例子 | | **第五段** | 用数据对比制造冲击 | ~500 字 | 解释"为什么差这么多" | | **第六段** | 回到开场，给出洞察 | ~300 字 | 不说教，留重量 | | **第七段** | 分级推荐延伸阅读 | ~200 字 | 入门 3/进阶 4/学术 3 | --- ## 框架详解（AI 内部参考） ### 第一段：场景代入 - 用一个**具体场景**（如咖啡馆、美术馆、深夜加班）引出核心问题 - **不要直接下定义** - 制造代入感，让读者产生"这说的就是我"的感觉 **示例结构：** ``` 你有没有遇到过这样的场景：[具体场景描述] 你尝试过 [方法 A]，结果 [失败] 你又试了 [方法 B]，还是 [不行] 这背后到底缺了什么？ ``` ### 第二段：先破后立 - 先带读者**走弯路** - 列出**2-3 种常见错误解释** - 给出**致死反例**，要狠，不留情面 - 让读者觉得"我之前也这么想" **错误答案模板：** ``` [常见误解] 听起来很有道理，但 [反例] [具体案例证明为什么错] ``` ### 第三段：本质洞察 - **一句话说清本质** - 展开论证 - 用例子给结论 - 让读者能给别人讲明白 **正确答案模板：** ``` 其实，[核心概念] 的本质就是 [一句话定义] 为什么这么说？[论证] 举个例子：[具体例子] ``` ### 第四段：跨界验证（核心部分） - 把核心观点放到**4-5 个不同领域**验证 - 看它如何起作用 - 每个领域配**具体例子** - 让读者觉得"原来这么多领域都相关" **推荐领域组合：** - 商业/职场 - 日常生活 - 历史/文化 - 科技/AI - 艺术/创作 **每个领域结构：** ``` [核心观点] 同样适用 例子：[具体案例] 这说明 [洞察] ``` ### 第五段：数据冲击 - 找**强对比**（如古代 vs 现代、A 方法 vs B 方法） - 用**数据作为转折点** - 解释"为什么差这么多" **对比模板：** ``` [事物 A]：[数据/结果] [事物 B]：[数据/结果] 差距 [X] 倍 为什么？[深层原因] ``` ### 第六段：闭环升华 - **回到开场场景**，形成闭环 - 给出**更深洞察** - **不说教** - 留有重量的结论 **结尾模板：** ``` 回到开头那个 [场景] 现在你知道了 [核心洞察] 下次遇到 [类似情况]，你可以 [行动建议] ``` ### 第七段：延伸阅读 - 推荐**10 本书** - 分级：入门 3 本、进阶 4 本、学术 3 本 - 每本配**一句话推荐理由** --- ## 写作技巧 | 技巧 | 说明 | 示例 | |------|------|------| | **故事化** | 开场用故事，每个论点配例子，结尾形成闭环 | "你有没有遇到过..." | | **有悬念** | 先绕弯子再给答案，制造"原来如此"的快感 | 先列错误答案，再给正确答案 | | **用"你"拉近** | 不说"读者"，用"你"来称呼，制造代入感 | "你可以试试"而非"读者应该" | | **数据作为转折点** | 论证到一半突然抛出数据 | "但数据显示，差距是 7 倍" | | **对比制造冲击** | A 对比 B，差距在哪里 | "古代 X 天 vs 现代 X 分钟" | --- ## 质量检验（五个问题） 写作完成后，用以下五个问题自检： 1. **开场三句话**，读者会不会继续往下读？ 2. **错误答案**，读者会不会觉得"我之前也这么想"？ 3. **正确答案**，读者能不能给别人讲明白？ 4. **触类旁通**，读者会不会觉得"原来这么多领域都相关"？ 5. **结尾**，读者会不会有"值了"的感觉？ --- ## 使用场景 ✅ **适合：** - 深入浅出讲明白某个概念 - 教会别人某个东西 - 解释复杂的哲学、商业、AI、语言学、社会学问题 ❌ **不适合：** - 新闻快讯 - 简短通知 - 纯技术文档 --- ## 注意事项 ### 五不要 | 不要 | 错误示例 | 正确写法 | |------|----------|----------| | **不要学术腔** | "本文将探讨..." | "你有没有遇到过..." | | **不要堆砌术语** | "在 xx 现象学原理中..." | "简单来说就是..." | | **不要说教** | "所以我们应该..." | "你可以试试..." | | **不要回避争议** | "学术界有不同看法..." | "他认为..." | | **不要装谦虚** | "笔者才疏学浅..." | 直接说 | --- ## 使用方式 当用户要求写文章、解释概念、创作内容时，如果符合以下触发条件，自动使用此写作框架： **触发条件：** - 用户要求"写一篇关于 X 的文章" - 用户要求"解释 X 概念" - 用户要求"教会我 X" - 内容涉及哲学、商业、AI、语言学、社会学等复杂主题 **输出格式：** 按照七步框架依次输出，**不显示框架标题**，用自然过渡连接各部分。 --- *Skill 版本：1.1 | 基于李诞 OpenClaw 写作心法整理*

path: scripts/README.md
content: # 质量检查清单使用指南

---

## 📋 检查清单概览

### 五大核心问题

| 序号 | 问题 | 检查要点 |
|------|------|----------|
| 1 | 开场三句话，读者会不会继续往下读？ | 具体场景、用"你"称呼、不提定义 |
| 2 | 错误答案，读者会不会觉得"我之前也这么想"？ | 2-3 种误解、致死反例、有杀伤力 |
| 3 | 正确答案，读者能不能给别人讲明白？ | 一句话本质、例子支撑、逻辑完整 |
| 4 | 触类旁通，读者会不会觉得"原来这么多领域都相关"？ | 4-5 个领域、各有案例、有洞察 |
| 5 | 结尾，读者会不会有"值了"的感觉？ | 回到开场、更深洞察、不说教 |

---

## 🛠️ 使用方法

### 方法一：自动检查（推荐）

```bash
# 检查文章文件
python scripts/quality-check.py article.md

# 示例
python scripts/quality-check.py /Users/ekko/.openclaw/workspace/articles/ai-programmer-fear.md
```

**输出示例：**
```
============================================================
📋 李诞写作心法 - 质量检查报告
============================================================

总体状态：✅ 通过
文章字数：5234 字

详细检查：
------------------------------------------------------------
✅ 开场吸引力：开场有吸引力
✅ 错误答案：错误答案部分完整（5 处转折）
✅ 核心洞察：核心洞察清晰（7 个例子支撑）
✅ 跨领域验证：跨领域验证充分（5 个领域：商业，历史，艺术，科技，教育）
✅ 结尾升华：结尾有升华且不说教
✅ 框架标题隐藏：框架标题已隐藏
✅ 数据对比：数据充分（12 个数据点）
✅ 书籍推荐：推荐 10 本书，已分级

============================================================
```

### 方法二：手动检查

写作完成后，逐个回答以下问题：

#### ✅ 开场检查
- [ ] 第一句是否有具体场景（时间、地点、人物）？
- [ ] 是否用"你"称呼读者？
- [ ] 是否避免"本文将探讨"等学术腔？
- [ ] 是否提出核心问题而非直接给答案？

#### ✅ 错误答案检查
- [ ] 是否列出至少 2 种常见误解？
- [ ] 每种误解是否有具体反例？
- [ ] 反例是否有杀伤力（不是温和反驳）？
- [ ] 读者会不会觉得"我之前也这么想"？

#### ✅ 核心洞察检查
- [ ] 能否用一句话说清本质？
- [ ] 是否有至少 2 个具体例子支撑？
- [ ] 逻辑链条是否完整？
- [ ] 读者能否转述给别人？

#### ✅ 跨领域检查
- [ ] 是否覆盖 4-5 个不同领域？
- [ ] 每个领域是否有具体案例？
- [ ] 领域之间是否有明显差异？
- [ ] 每个案例是否有洞察总结？

**推荐领域组合：**
- 商业/职场
- 历史/文化
- 艺术/创作
- 科技/AI
- 日常生活/教育/医疗

#### ✅ 结尾检查
- [ ] 是否回到开场场景？
- [ ] 是否给出更深层洞察？
- [ ] 是否有可执行的建议？
- [ ] 是否避免"所以我们应该"等说教？

---

## 📊 结构检查清单

| 检查项 | 标准 | 检查方法 |
|--------|------|----------|
| 段落数量 | 6-8 个主要段落 | 目测或数空行 |
| 总字数 | 4000-6000 字 | `wc -m article.md` |
| 框架标题 | 不出现"开场故事"等 | 搜索禁用词 |
| 数据对比 | 至少 2-3 组数据 | 搜索数字和百分比 |
| 书籍推荐 | 10 本，分 3 级 | 数《》数量和分级词 |

---

## 🚫 禁用词清单

### 绝对不要出现的框架标题
```
开场故事
错误答案
正确答案
触类旁通
对比制造
结尾升华
七步框架
```

### 避免的学术腔
```
本文将探讨
笔者认为
综上所述
由此可见
在 xx 现象学原理中
从 xx 理论来看
根据 xx 模型
```

### 避免的说教语气
```
所以我们应该
因此必须
希望大家
让我们
读者应该
```

---

## ✅ 推荐用语

### 拉近读者距离
```
你有没有遇到过...
你可以试试...
你可能会想...
你之前是不是也...
```

### 制造悬念
```
但事情没那么简单...
问题在于...
真正的原因是...
这背后缺了什么？
```

### 给出洞察
```
其实...的本质就是...
换句话说...
这意味着...
```

---

## 📝 检查流程建议

### 写作前
1. 确定核心问题/概念
2. 想好开场场景
3. 列出 2-3 个常见误解
4. 准备 4-5 个领域的案例

### 写作中
1. 按照七步框架写（不显示标题）
2. 每写完一段，对照检查清单
3. 确保用"你"称呼，避免学术腔

### 写作后
1. 运行自动检查脚本
2. 手动回答五大核心问题
3. 根据建议修改
4. 再检查一遍

---

## 🎯 快速评分表

| 维度 | 1 分 | 3 分 | 5 分 |
|------|------|------|------|
| 开场吸引力 | 抽象定义 | 有场景但平淡 | 具体场景+代入感 |
| 错误答案 | 1 种或无反例 | 2 种有反例 | 3 种反例狠 |
| 核心洞察 | 模糊不清 | 能理解但难转述 | 一句话能说清 |
| 跨领域 | 1-2 个领域 | 3 个领域 | 4-5 个领域 |
| 结尾 | 简单总结 | 有洞察但说教 | 闭环+洞察+行动 |

**总分 20-25 分**：可以发布  
**总分 15-19 分**：需要修改  
**总分<15 分**：建议重写

---

*版本：1.0 | 最后更新：2026-03-30*


path: scripts/quality-check.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
李诞写作心法 - 质量检查清单
用于检验文章是否符合七步框架的质量标准
"""

import re
from typing import List, Dict, Tuple

# ============= 质量检查清单 =============

QUALITY_CHECKS = [
    {
        "id": 1,
        "question": "开场三句话，读者会不会继续往下读？",
        "check_type": "opening_hook",
        "description": "检查开场是否用具体场景而非抽象定义",
        "criteria": [
            "✓ 包含具体场景描述（时间、地点、人物）",
            "✓ 使用'你'称呼，制造代入感",
            "✓ 提出核心问题而非直接给答案",
            "✗ 避免'本文将探讨'等学术腔",
            "✗ 避免直接下定义"
        ]
    },
    {
        "id": 2,
        "question": "错误答案，读者会不会觉得'我之前也这么想'？",
        "check_type": "wrong_answers",
        "description": "检查是否列出 2-3 种常见误解并给出反例",
        "criteria": [
            "✓ 列出至少 2 种常见错误解释",
            "✓ 每种错误都有致死反例",
            "✓ 反例具体、有杀伤力",
            "✗ 避免温和的反驳",
            "✗ 避免'学术界有不同看法'等回避表述"
        ]
    },
    {
        "id": 3,
        "question": "正确答案，读者能不能给别人讲明白？",
        "check_type": "core_insight",
        "description": "检查本质洞察是否一句话能说清",
        "criteria": [
            "✓ 有一句话本质定义",
            "✓ 有具体例子支撑",
            "✓ 逻辑链条完整",
            "✗ 避免堆砌术语",
            "✗ 避免模糊表述"
        ]
    },
    {
        "id": 4,
        "question": "触类旁通，读者会不会觉得'原来这么多领域都相关'？",
        "check_type": "cross_domain",
        "description": "检查是否在 4-5 个不同领域验证观点",
        "criteria": [
            "✓ 覆盖 4-5 个不同领域",
            "✓ 每个领域有具体案例",
            "✓ 领域之间有差异性",
            "✓ 每个案例都有洞察总结",
            "✗ 避免领域过于相似",
            "✗ 避免只有观点没有例子"
        ]
    },
    {
        "id": 5,
        "question": "结尾，读者会不会有'值了'的感觉？",
        "check_type": "closing",
        "description": "检查是否回到开场场景并给出更深洞察",
        "criteria": [
            "✓ 回到开场场景，形成闭环",
            "✓ 给出更深层洞察",
            "✓ 有可执行的建议",
            "✓ 不说教，留有重量",
            "✗ 避免'所以我们应该'等说教",
            "✗ 避免简单总结重复"
        ]
    }
]

# ============= 结构检查 =============

STRUCTURE_CHECKS = {
    "paragraph_count": {
        "name": "段落数量",
        "target": "6-8 个主要段落",
        "description": "检查文章是否有清晰的段落划分"
    },
    "word_count": {
        "name": "总字数",
        "target": "4000-6000 字",
        "description": "检查文章长度是否适中"
    },
    "no_framework_titles": {
        "name": "无框架标题",
        "target": "不出现'开场故事'、'错误答案'等标题",
        "description": "检查是否隐藏了框架结构"
    },
    "data_points": {
        "name": "数据对比",
        "target": "至少 2-3 组数据对比",
        "description": "检查是否有数据作为转折点"
    },
    "book_recommendations": {
        "name": "延伸阅读",
        "target": "10 本书，分 3 级",
        "description": "检查是否有分级书单（入门 3/进阶 4/学术 3）"
    }
}

# ============= 文风检查 =============

STYLE_CHECKS = {
    "use_you": {
        "name": "用'你'称呼",
        "pattern": r"你",
        "min_count": 10,
        "description": "检查是否用'你'拉近与读者距离"
    },
    "no_academic_tone": {
        "name": "无学术腔",
        "forbidden": ["本文将探讨", "笔者认为", "综上所述", "由此可见"],
        "description": "检查是否避免学术腔调"
    },
    "no_jargon": {
        "name": "无术语堆砌",
        "forbidden": ["在 xx 现象学原理中", "从 xx 理论来看", "根据 xx 模型"],
        "description": "检查是否避免术语堆砌"
    },
    "story_elements": {
        "name": "故事元素",
        "pattern": r"场景 | 例子 | 案例 | 故事",
        "min_count": 5,
        "description": "检查是否有足够的故事和案例"
    }
}

# ============= 检查函数 =============

def check_opening_hook(text: str) -> Tuple[bool, str]:
    """检查开场是否有吸引力"""
    lines = text.strip().split('\n')
    if len(lines) < 3:
        return False, "开场太短，需要至少 3 句话"
    
    opening = '\n'.join(lines[:5])
    
    # 检查是否有具体场景
    scene_keywords = ["场景", "你", "有没有", "遇到", "坐在", "站在", "看着"]
    has_scene = any(kw in opening for kw in scene_keywords)
    
    # 检查是否避免学术腔
    academic_phrases = ["本文将", "本文探讨", "笔者", "综上所述"]
    has_academic = any(phrase in opening for phrase in academic_phrases)
    
    if not has_scene:
        return False, "开场缺少具体场景描述"
    if has_academic:
        return False, "开场有学术腔调"
    
    return True, "开场有吸引力"


def check_wrong_answers(text: str) -> Tuple[bool, str]:
    """检查是否有错误答案部分"""
    # 查找反驳/转折的表达
    counter_patterns = ["但", "但是", "然而", "其实不对", "问题是", "反例"]
    counter_count = sum(text.count(p) for p in counter_patterns)
    
    if counter_count < 3:
        return False, "缺少足够的反驳和反例（至少 3 处转折）"
    
    # 检查是否有常见误解的列举
    misconception_patterns = ["有人", "常见", "以为", "认为", "听起来"]
    has_misconception = any(p in text for p in misconception_patterns)
    
    if not has_misconception:
        return False, "没有列举常见误解"
    
    return True, f"错误答案部分完整（{counter_count}处转折）"


def check_core_insight(text: str) -> Tuple[bool, str]:
    """检查核心洞察是否清晰"""
    # 查找本质定义的表达
    insight_patterns = ["本质", "其实", "就是", "核心", "关键在于"]
    has_insight = any(p in text for p in insight_patterns)
    
    if not has_insight:
        return False, "缺少本质洞察的表达"
    
    # 检查是否有例子支撑
    example_patterns = ["比如", "例如", "举个例子", "就像"]
    example_count = sum(text.count(p) for p in example_patterns)
    
    if example_count < 2:
        return False, "核心洞察缺少例子支撑（至少 2 个例子）"
    
    return True, f"核心洞察清晰（{example_count}个例子支撑）"


def check_cross_domain(text: str) -> Tuple[bool, str]:
    """检查跨领域验证"""
    domains = ["商业", "职场", "历史", "文化", "艺术", "科技", "生活", "教育", "医疗"]
    found_domains = [d for d in domains if d in text]
    
    if len(found_domains) < 4:
        return False, f"跨领域不足（仅{len(found_domains)}个领域，需要 4-5 个）"
    
    return True, f"跨领域验证充分（{len(found_domains)}个领域：{', '.join(found_domains)}）"


def check_closing(text: str) -> Tuple[bool, str]:
    """检查结尾是否升华"""
    lines = text.strip().split('\n')
    closing = '\n'.join(lines[-10:])  # 最后 10 行
    
    # 检查是否回到开场
    closing_keywords = ["回到", "现在", "下次", "可以"]
    has_return = any(kw in closing for kw in closing_keywords)
    
    # 检查是否避免说教
    preachy_phrases = ["所以我们应该", "因此必须", "希望大家", "让我们"]
    is_preachy = any(phrase in closing for phrase in preachy_phrases)
    
    if not has_return:
        return False, "结尾没有回到开场场景或给出行动建议"
    if is_preachy:
        return False, "结尾有说教语气"
    
    return True, "结尾有升华且不说教"


def check_no_framework_titles(text: str) -> Tuple[bool, str]:
    """检查是否隐藏了框架标题"""
    forbidden_titles = [
        "开场故事", "错误答案", "正确答案", "触类旁通",
        "对比制造", "结尾升华", "延伸阅读", "七步", "框架"
    ]
    
    found_titles = [t for t in forbidden_titles if t in text]
    
    if found_titles:
        return False, f"出现框架标题：{', '.join(found_titles)}"
    
    return True, "框架标题已隐藏"


def check_data_points(text: str) -> Tuple[bool, str]:
    """检查数据对比"""
    # 查找数字和百分比
    import re
    numbers = re.findall(r'\d+[\.%]', text)
    
    if len(numbers) < 3:
        return False, f"数据点不足（仅{len(numbers)}个，需要至少 3 个）"
    
    return True, f"数据充分（{len(numbers)}个数据点）"


def check_book_recommendations(text: str) -> Tuple[bool, str]:
    """检查延伸阅读书单"""
    # 查找书名号
    import re
    books = re.findall(r'[《](.*?)[》]', text)
    
    if len(books) < 8:
        return False, f"推荐书籍不足（仅{len(books)}本，需要 8-10 本）"
    
    # 检查是否有分级
    level_keywords = ["入门", "进阶", "初级", "高级", "学术"]
    has_levels = any(kw in text for kw in level_keywords)
    
    if not has_levels:
        return False, "书籍推荐没有分级"
    
    return True, f"推荐{len(books)}本书，{'已' if has_levels else '未'}分级"


# ============= 主检查函数 =============

def run_quality_check(text: str) -> Dict:
    """运行完整的质量检查"""
    results = {
        "overall_pass": True,
        "checks": [],
        "suggestions": []
    }
    
    # 五大核心问题检查
    checks = [
        ("开场吸引力", check_opening_hook),
        ("错误答案", check_wrong_answers),
        ("核心洞察", check_core_insight),
        ("跨领域验证", check_cross_domain),
        ("结尾升华", check_closing),
        ("框架标题隐藏", check_no_framework_titles),
        ("数据对比", check_data_points),
        ("书籍推荐", check_book_recommendations),
    ]
    
    for name, check_func in checks:
        passed, message = check_func(text)
        results["checks"].append({
            "name": name,
            "passed": passed,
            "message": message
        })
        if not passed:
            results["overall_pass"] = False
            results["suggestions"].append(f"【{name}】{message}")
    
    # 字数统计
    word_count = len(text)
    results["word_count"] = word_count
    if word_count < 3000:
        results["suggestions"].append(f"【字数】{word_count}字，建议扩展到 4000-6000 字")
    elif word_count > 8000:
        results["suggestions"].append(f"【字数】{word_count}字，建议精简到 6000 字以内")
    
    return results


def print_check_report(results: Dict) -> str:
    """打印检查报告"""
    report = []
    report.append("=" * 60)
    report.append("📋 李诞写作心法 - 质量检查报告")
    report.append("=" * 60)
    report.append("")
    
    # 总体结果
    status = "✅ 通过" if results["overall_pass"] else "❌ 需改进"
    report.append(f"总体状态：{status}")
    report.append(f"文章字数：{results.get('word_count', 0)}字")
    report.append("")
    
    # 详细检查
    report.append("详细检查：")
    report.append("-" * 60)
    for check in results["checks"]:
        icon = "✅" if check["passed"] else "❌"
        report.append(f"{icon} {check['name']}: {check['message']}")
    
    # 改进建议
    if results["suggestions"]:
        report.append("")
        report.append("改进建议：")
        report.append("-" * 60)
        for i, suggestion in enumerate(results["suggestions"], 1):
            report.append(f"{i}. {suggestion}")
    
    report.append("")
    report.append("=" * 60)
    
    return '\n'.join(report)


# ============= CLI 入口 =============

if __name__ == "__main__":
    import sys
    
    if len(sys.argv) < 2:
        print("用法：python quality-check.py <文章文件路径>")
        print("示例：python quality-check.py article.md")
        sys.exit(1)
    
    file_path = sys.argv[1]
    
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            text = f.read()
        
        results = run_quality_check(text)
        report = print_check_report(results)
        print(report)
        
    except FileNotFoundError:
        print(f"错误：文件不存在 - {file_path}")
        sys.exit(1)
    except Exception as e:
        print(f"错误：{e}")
        sys.exit(1)


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)