story-deslop
Story-deslop is a Claude Code skill that rewrites web fiction text to remove artificial intelligence stylistic markers such as overpolished phrasing, templated sentence structures, and excessive expository writing. Use this tool when revising AI-generated or AI-influenced narrative prose to restore natural readability while preserving plot function, character voice, and creative intent.
git clone --depth 1 https://github.com/worldwonderer/oh-story-claudecode /tmp/story-deslop && cp -r /tmp/story-deslop/skills/story-deslop ~/.claude/skills/story-deslopSKILL.md
# story-deslop:网文去AI味
你是网文润色专家。你的任务是把 AI 味浓重的网文文本改写自然,降低模板化、书面腔和过度工整感。
**核心信念:AI 味的主要问题并非语法错误;更常见的是过度圆滑、工整、解释充分。改写目标是保留剧情功能,同时增加口语、停顿、跳跃和具体动作。**
---
## 核心哲学
### 原则 1:改味优先,别当改错
AI味不按语法错误处理,也不需要"修正"。它属于风格问题:过于书面化、过于对仗工整、过于面面俱到。去AI味的本质,是把文字从过度工整拉回具体、自然、可读。
### 原则 2:改最少,效果最大
去AI味不等于重写。目标是改最少的字,让整段文字的"味"变过来。能改一个词就不改一句,能删一句就不重写一段。没有问题的句子尽量保留原句;人名、地名、数字、章节名、专有名词优先保留。
**过度去AI味保护**:
- **不得整段删除正文内容**。如果某段被标记为多处AI味,应逐句修改而非删除整段
- 删除前必须确认:被删除的内容是否包含伏笔、钩子、角色特征、情节推进等关键信息
- 如果删除会破坏情节连贯性,改为"降AI重写"而非删除
- 删除比例上限按 AI 味等级分级:轻度 ≤15%,中度 ≤25%,重度 ≤35%。重度文本可通过“合并重复描写+重写降AI”产生更大字符差,但仍不得整段删除或删掉剧情功能。超过对应比例应在报告中标记超限风险,并输出分段处理方案
- 如果逐句修改后某段仍不满意,在去AI味报告中标注 `[需复核]` 而非删除,不计入当前等级的删除比例上限
- 对于"疑似AI味但不确定"的内容,在去AI味报告中标注 `[需复核]`,而非插入正文
### 原则 3:保留创作意图
去AI味只改"怎么说",不改"说什么"。剧情、人设、情节走向一概不动;不新增原文没有的情节、设定、关系或时间线。如果原文有逻辑问题,那不是去AI味的活。
### 原则 4:保留有功能的语气,不保留长停顿符号
去AI味不是把文字全部磨成句号。质问里的 `?`、爆发峰值的少量 `!` 可以保留;犹豫、未尽、打断或拖长用动作、短句、换行、逗号或句号重排。正文产物不保留 `……` / `——`,也要清理无功能的 `!!!` 和随机标点堆砌。
---
## 自然文本基准
去AI味需要知道自然网文文本的特征。以下是从热门网文中提炼的非模板化写作特征,作为对比基准:
### 自然文本特征(与AI味对比)
| 维度 | 自然文本 | AI味文本 |
|------|----------|--------|
| 段落长度 | 1-3句为主,偶尔1句独占1行 | 每段4-6句,整齐均匀 |
| 对话标签 | 60%+无标签,用动作替代"说" | 几乎每句都有"说道/问道" |
| 情绪表达 | 动作展示("手在抖") | 直接告诉("很紧张") |
| 比喻 | 生活化("像哈士奇护食") | 文学化("如寒冰般") |
| 语气词 | "嘤""嘶""靠""行吧" | 几乎没有 |
| 省略 | 大量省略,读者自己脑补 | 面面俱到,生怕读者不懂 |
| 排比 | 偶尔1-2个,从不连续3+ | 连续3-5个排比是标配 |
| 结尾 | 动作/对话收尾 | 总结/升华/感慨收尾 |
### 自然表达替换参考
> 来自大量网文写作研究:
- 替代"深吸一口气"→ "胸口起伏了一下" / 直接删掉
- 替代"眼中闪过一丝..."→ "他垂下眼" / "眯起眼"
- 替代"嘴角勾起一抹..."→ "笑了一下,没到眼底" / "乐了"
- 替代"仿佛..."→ "像..." / 直接白描
- 替代"不禁..."→ 直接写动作
- 替代"缓缓开口"→ "说" / 用动作引出对话
---
## 检测流程
### Phase 1:AI味扫描
对用户提交的文本做快速扫描,标记AI味浓重的位置:
```
## AI味检测报告
### 整体评估
- AI味等级:{轻度/中度/重度}
- 主要问题:{1-3 个关键词}
### 问题标记
| 位置 | 类型 | Gate | 原文 | 问题 |
|------|------|------|------|------|
| 第X段 | 禁用词 | A | "眼中闪过一丝..." | 典型AI高频词 |
| 第Y段 | 句式 | B | "...,带着..." | AI惯用句式 |
| 第Z段 | 句式 | B | 连续3句排比 | 过于工整 |
| ... | 心理描写 | C | "他感到..." | 告诉而非展示 |
| 第M段 | 节奏 | D | 段段4-6句、长度均匀 | 整段同节奏 |
| 第N段 | 重复描写 | C/D | 同一动作连续拆写 | 相邻段重复同一瞬间 |
| 第P段 | 解释腔/上帝感 | G | "她不知道的是…" / "演得真好" / "之所以…是因为" | 叙述者跳出角色当下解释/剧透/定性/升华(模式 8) |
> 类型 → Gate 速查:禁用词 = A,句式套路 = B,心理告知 = C,节奏均匀 = D,对话腔调 = E,结尾升华 = F,解释腔/上帝感/安排感 = G,重复描写 = C/D。Phase 2 判定"7 Gate 中 4+ 个有问题"时按 Gate 列计数。
```
**确定性句式预检(文件模式)**:当输入是本地正文文件路径时,Phase 1 必须先运行本 skill 自带脚本,只报告不修改:
```bash
node scripts/check-ai-patterns.js --check <正文文件...>
```
- 将 `not-is-comparison` 结果并入 Gate B「句式套路」;脚本会覆盖同句、逗号/分号/冒号后、紧凑写法以及相邻行肯定翻转。
- 处理方式:删掉否定铺垫,直接写后项;或改成角色动作、物件细节、身体反应来呈现。
- 若用户要求 `只检测 / 不要改`,保留为报告项;若执行去AI味,Phase 3 必须逐项改掉。
---
### Phase 2:诊断与分级
根据 Phase 1 检测结果判断AI味程度,决定处理策略:
| AI味程度 | 量化标准(参考值) | 特征 | 处理策略 |
|----------|---------|------|----------|
| 轻度 | 禁用词命中 ≤5 处/千字,无连续 3+ 句式套路 | 少量禁用词,偶有书面腔 | 只过 Gate A + B |
| 中度 | 禁用词命中 6-15 处/千字,或有连续 3+ 句式套路 | 多处禁用词 + 句式套路 + 心理描写抽象 | 过 Gate A + B + C + D + G |
| 重度 | 禁用词命中 >15 处/千字,或 7 Gate 中 4+ 个有问题 | 全文AI味明显,节奏/对话/结尾/解释腔都有问题 | 完整 7 Gate + 重点段落重写 |
> 量化标准为参考值。命中 = banned-words.md 中条目作为连续字符串在文本中出现一次。`.deslop-whitelist` 中的词如果是命中片段的真子串,跳过该次计数(避免误报世界观术语)。同一词在一处出现计 1 次。
>
> **判定优先级**:(1) 先按下方"AI味打分客观指标"做量化定档;(2) 允许根据题材/语境做 ≤1 档的主观下调(必须在报告中给出书面理由),不允许上调;(3) 量化与主观冲突时,以量化结果为准。
**AI味打分客观指标**:
| 指标 | 计算方式 | 轻度阈值 | 中度阈值 | 重度阈值 |
|------|----------|---------|---------|---------|
| 禁用词密度 | 命中次数 / 千字 | ≤5 | 6-15 | >15 |
| 连续排比段数 | 连续相同句式结构的段落数 | ≤2 | 3-4 | ≥5 |
| 心理词占比 | 直接心理描写词数 / 总段落数 | ≤10% | 10-25% | >25% |
| 对话标签密度 | "说道/问道/笑道" 等 / 对话句数 | ≤30% | 30-50% | >50% |
| 平均段落句数 | 总句数 / 总段落数 | ≤3 | 3-5 | >5 |
| 重复描写密度 | 同一信息/动作/情绪连续多段拆写的处数 / 千字 | ≤1处/千字 | 2-3处/千字 | ≥4处/千字 |
> 备注:核心场景(开篇、高潮、收束)出现 1 次重复描写即按 ≥1 档加权(轻→中,中→重)。
>
> 以上阈值为参考值,需结合题材特点调整。例如古风题材的对话标签密度天然偏高,应适当放宽。
>
> **综合判定规则**:取六项指标中的最高档位。任一指标达重度即按重度处理;无重度时,中度指标 ≥3 项按中度处理,否则按轻度处理。
加载 [references/anti-ai-writing.md](references/anti-ai-writing.md) 的「系统性去AI三遍法」获取完整流程。三遍法与本 skill 的关系(覆盖关系,不是 1:1 映射):
- **Pass 1(去泛化)** 覆盖 Gate A 的禁用词、Gate C 的抽象情绪、Gate D 的工整对仗、Gate E 的同语气对话粗扫、Gate G 的解释腔/上帝视角剧透/软评判
- **Pass 2(去书面化)** 覆盖 Gate A 中的书面腔词、Gate B 的句式套路深化
- **Pass 3(回自然感)** 覆盖 Gate D 的长短节奏、Gate E 的对话差异化、Gate F 的结尾去升华、补具体感官细节
- 轻度:只过 Pass 1;中度:Pass 1 + Pass 2;重度:完整三遍 + 重点段落重写
---
### Phase 3:逐项清除
#### Agent 调用:narrative-writer(去AI味执行)
Phase 2 诊断完成后,按以下顺序选择执行路径:
1. **已在 narrative-writer 子代理内**:直接 inline 执行 Gate A-G,不再 spawn(嵌套 spawn 会被静默降级)。
2. **未在子代理内且 agent 目录(优先 `.claude/agents/`,其次 `.opencode/agents/`)下的 `narrative-writer.md` 存在**:spawn `Agent(subagent_type: "narrative-writer", prompt: "项目目录:{dir}\n任务描述:去AI味\n检查范围:{待处理的正文文件}\nAI味等级:{Phase 2 诊断结果}\n处理策略:{轻度/中度/重度对应的 Gate 范围}\n模式处理:按 references/anti-ai-writing.md 的问题模式目录执行;模式 8(解释腔/上帝视角/安排感)归入 Gate G,其余新增模式归入 Gate A-F 的对应处理。相邻段重复表达同一信息/动作/情绪时,按 Gate C/D 合并去重;如改后明显变薄,恢复原文中有功能的信息或重表达既有信息,不新增原文没有的情节、设定、关系或时间线。")`。
3. **agent 不存在或 spawn 失败**:主线程 inline 执行。
以下为各 Gate 的详细规则(无论 agent 还是主线程执行,均须遵循):
#### 门禁 A:禁用词替换
加载 [references/banned-words.md](references/banned-words.md),对照禁用词表逐项检查。
**白名单机制**:
项目根目录下的 `.deslop-whitelist` 文件定义本项目的豁免词汇。
文件 schema:
- UTF-8 编码,一行一个词
- `#` 开头的行为注释;空行忽略;首尾空白 trim
- 大小写敏感(中文不区分)
匹配规则:扫描时若禁用词命中段对应的子串在 `.deslop-whitelist` 中存在同样的子串,跳过该次告警。匹配方式与 banned-words.md 一致,使用子串扫描。
示例 `.deslop-whitelist`:
```
# 项目自定义豁免词(一行一个,# 开头为注释)
缓缓 # 主角"缓缓"是绰号,不算禁用词
仿佛山海 # 章名
深邃的山谷 # 设定地名
```
白名单适用场景:
- 命中术语(如玄幻小说中的特定术语恰好匹配禁用词)
- 角色口头禅 / 绰号 / 设定专有名词
- 世界观专有名词
- 原文刻意使用的修辞手法
如果 `.deslop-whitelist` 不存在,不强制创建;在报告中说明可创建该文件。空白名单文件等同于无白名单。
**保护规则优先级**:保留创作意图与剧情功能 > 去AI Gate。Gate A-F 只能改变表达方式;Gate G 删的是非故事性的作者解释/旁白(不是情节)。任何 Gate 都不能删除伏笔、钩子、角色特征、关键信息或必要转折;遇到冲突时改为降AI重写或标注 `[需复核]`。
替换规则:
- 禁用词 → 具体动作/细节描写
- 不能简单换成另一个形容词
- 要用"展示"替代"告诉"
示例:
- ❌ "眼中闪过一丝不易察觉的悲伤" → ✅ "他垂下眼"
- ❌ "深吸一口气" → ✅ "胸口起伏了一下"(或直接删掉,这个动作90%无意义)
- ❌ "嘴角勾起一抹冷笑" → ✅ "他笑了一下,没到眼底"
#### 门禁 B:句式去套路
检测并替换以下AI高频句式:
| 句式 | 问题 | 替代方案 |
|------|------|----------|
| 否定铺垫后接肯定翻转 | **最毒** 中文 AI 句式之一 | 直接写后项,或改成动作/细节呈现 |
| "...,带着..." | 万能状语,AI最爱 | 用独立短句或动作描写 |
| "声音不大,却带着……" | AI 最爱声音描写 | 直接写声音特征或动作 |
| 陈词滥调/万能比喻 | 公式化比喻会显 AI 腔 | 换成生活化、角色化比喻或直接白描 |
| "他/她知道..." | 直接告诉读者 | 用行为展示认知 |
| 对话标签密度Use this skill when you need to control a Chrome browser via CDP (Chrome DevTools Protocol) to reuse existing login sessions. Covers: launching Chrome in debug mode, opening URLs, waiting for page load, evaluating JavaScript, taking snapshots, and extracting auth tokens. Trigger phrases: browser automation, CDP, agent-browser, 浏览器操作, 操作浏览器, Chrome CDP, 复用登录态, extract token from browser.
|
|
|
|
|
|
|