oh-story-claudecode
面向中文网文创作的 Agent Skills,覆盖选题分析、拆文、写作、润色和封面,并通过文件跟踪长篇连贯性。
中文简介经编辑校订 · agent-skills / ai-agent / ai-novel-writing / ai-writing / antigravity / chinese-novel
README / 项目原文
Oh Story
网文写作 skill 包:扫榜、拆文、写作、去AI味、封面图一套流程,装进你正在用的编程 Agent。
这是什么
Oh Story 覆盖长篇与短篇网络小说的全流程:扫榜选材 → 拆解爆款 → 搭大纲写正文 → 去AI味 → 生成封面图。 它以 13 个 skill 的形式装进你已经在用的编程 Agent,写作用的模型就是该 Agent 的模型,不需要 GPU,也不需要另外配模型。
- 用文件系统当记忆 — 设定、大纲、正文、追踪各自独立维护,压缩上下文或更换会话后,从文件恢复当前进度、伏笔和未完承诺。
- 确定性检查与门禁 — 长篇写前检查细纲和追踪,写后检查截断、工程词和常见 AI 句式。支持 hooks 的宿主自动执行对应检查,其他环境按 skill 流程执行。
- 适配 7 款编程 Agent — Claude Code · Codex CLI · Google Antigravity · OpenCode · ZCode · OpenClaw · Reasonix;能读取项目文件的通用 Web AI / Agent 环境也可使用。
- 面向的平台 — 起点、番茄、晋江、七猫、知乎盐言等长短篇平台。
套路 = 确定性的情绪满足
先扫榜找题材、人设与切入点,再拆文分析节奏和剧情素材,最后用钩子、爽感和期待感组织自己的故事。 设定、正文和追踪分别落盘,作者决定方向,Agent 按确认后的方案推进。
安装
npx skills add zenstory-ai/oh-story-claudecode -y -g
-g 全局安装,所有目录可用;去掉 -g 则只装到当前目录。更新时重新执行同一条命令即可。
也可以直接对 Agent 说一句话(支持导入 GitHub 仓库 / skill 的平台都适用):
安装这个 skill https://github.com/zenstory-ai/oh-story-claudecode
装好后,在写作项目根运行 /story-setup(Codex 用 $story-setup)部署当前宿主支持的 hooks / agents / references,然后新开会话。
也可通过 ClawHub 查找;本仓库的发布范围见 ClawHub 发布清单。
各 Agent 的部署差异、已知限制与安装排查(Windows
ENOENT、Antigravityagy -p、目录残留等)见 各编程 Agent 的部署与安装排查。 版本与变更见 CHANGELOG.md 和 Releases,已有项目的更新步骤见升级指南。
看看它的输出
以下展示 skill 的真实产出,以及一份专门构造的 AI 腔测试样例,完整文件在 demo/。
续写状态卡:把当前状态写进文件
下面这本是项目作者自己的长篇,用 /story-import 把已发布的前 20 章反向重建成可续写工程。
下面是写第 21 章之前的状态卡。/story-long-write 从
追踪/上下文.md 读取连续性摘要,固定 7 栏、上限 12 KiB;主会话筛出本章相关状态交给写手,卡片全文不注入写手 prompt。细纲、相关设定和必要角色卡仍按任务读取:
## 当前位置
- 当前章:第20章 卷:第一卷·军宣整顿 故事时间:《如愿》点击破亿后的第二天
## 长期约束
- 军宣爽点必须通过作品效果、传播数据和围观反应链兑现,不能只靠系统播报。
- 钟嘉嘉未公开的军方培养安排属于作者真相,正文揭示前不能当成读者已知。
## 活跃伏笔
- F016|钟嘉嘉并非普通军报实习生,她的军方家庭背景仍未完全公开|埋第7章|回收章未定|高
- F049|吴伟收到寻衅滋事公诉通知,最终法律结果尚未落地|埋第18章|回收章未定|高
- F054|一位老兵邀请江晨上门听当年的故事,为后续创作提供入口|埋第20章|回收章未定|高
## 下一章承诺
- 先补第21章细纲,再承接老兵邀请、新歌伴奏和钢琴能力。
「作者真相」和「读者已知」分开记录,用于检查角色是否提前知道答案、伏笔是否已揭示。
完整文件:demo/长篇/.../追踪/上下文.md
续写第 21 章:从门禁到回写,一条链走完
上面的视频录的就是这一段。/story-long-write 写第21章 在一次真实会话里的产出与每一道检查:
细纲 细纲_第021章.md 追踪里写着「第21章尚无细纲」,skill 先补纲:单元 L1-03、目标情绪、本章标价、闭环状态、10 个情节点四列表格(外加可选的分辨率列)
章级检查 storyctl.py chapter check ready · 字数 2068 / 目标 2300
├ check-ai-patterns.js 0 命中
├ check-degeneration.js 0 命中
└ normalize-punctuation 0 命中
追踪提交 storyctl.py chapter commit tracking_committed=true · state_revision 0 → 1
派生视图 tracking_commit.py check 上下文.md / 伏笔.md / 角色状态/ / 时间线/ / 逐章记录/ 全部由 state 重生成,逐字一致
写正文前先检查细纲与追踪,细纲过结构验收后,由 narrative-writer 分两批写正文。单章提交前核对事实与伏笔,日更批次中未逐章检查的在批末核对;读感需要额外审读时再调用去味审查。交付前统一跑确定性收尾脚本与 chapter check。
提交之后,追踪状态是工具从 _tracking-state.json 整份重新渲染的,手改派生文件会被 check 拒绝。
对照上面的状态卡,回写实际改了什么(节选,省略了同批滚动的近三章速记与角色状态):
## 当前位置
-- 当前章:第20章 场景:火箭军文工团,钟嘉嘉送来老兵书法礼后
+- 当前章:第21章 场景:火箭军文工团办公室,江晨收到谭守义地址回信后
## 活跃伏笔
-- F054|一位老兵邀请江晨上门听当年的故事,为后续创作提供入口|埋第20章|回收章未定|高
+- F054|谭守义已给邻市地址,江晨定次日上门听故事|埋第20章|第22章|高
+- F057|谭守义有个讲了五十年没人听全过的故事,内容未揭示|埋第21章|第22章|高
+- F058|任务三:离别主题作品、开放日当天热度1000万+、限时14天|埋第21章|第27章|高
## 下一章承诺
-- 先补第21章细纲,再承接老兵邀请、新歌伴奏和钢琴能力。
+- 江晨向周薄森请假出营,赴邻市听谭守义讲完整故事并录音,揭示F057。
## 连贯性风险
-- 第21章尚无细纲,不能直接写正文。
+- 谭守义故事的作者真相为候选(E015),作者可在第22章细纲前改;揭示前不当读者已知。
新角色谭守义有了自己的设定卡和角色状态文件;他那个「讲了五十年没人听全过」的故事,真相候选(E015)记在
时间线/作者真相.md 并标为未揭示,读者已知.md 那一栏只有江晨看到的那句话。被退役的那条风险写进了
逐章记录/第021章.md 的「本章退役登记」——状态不会静默消失。
成品:正文/第021章_离别怎么会开花.md
· 大纲/细纲_第021章.md
· 设定/角色/谭守义.md
· 追踪/逐章记录/第021章.md
拆文报告:评分要给得出理由
/story-long-analyze 拆《盘龙》开篇 23 章(约 6.2 万字,起点经典,仅作拆解素材),按番茄男频升级流读者口味打分:
| 维度 | 评分 | 说明(节选) |
|---|---|---|
| 开篇钩子 | 2 | 前 500 字纯地理定位 + 晨练群像,无悬念 / 冲突 / 反差,靠「平民努力出头」慢渗。代入扎实但即时拉力弱。 |
| 主角塑造 | 4 | 延迟点名(第 60 段才点名)+ 他人惊叹引出,「衰败贵族 + 六岁神童」反差立人设。三章里最强项。 |
| 爽点设计 | 1 | 三章零传统爽点,爽感被刻意延迟到第 18 章金手指登场,赌代入复利。 |
综合:三章是「立人设强、给爽点零」的极端结构。直接照搬会劝退番茄读者, 但拆出来的局部技法(导师代言设定、延迟点名、身体反应外化)高度可复用。
完整报告:demo/拆文库/盘龙/拆文报告.md
短篇拆文:把自己的作品拆成可复用的模块
/story-short-analyze 拆《曾将爱意私藏》(作者自己的短篇,约 8,500 字,追妻火葬场 · 死遁),
产出 54 个情节节点、11 项写作手法。每个节点都锚定原文,并标注情绪类型与强度(−9~+9):
| 原文 | 抽出的结构 |
|---|---|
| 「霍总还不打算让沈暮月母子进门吗?」 「没必要,私生子而已。」 我正准备推门而入,听到这话,手停在了半空。 |
N1 门口偷听到「私生子而已」 类型{信息} · 情绪{震惊}{−7} 手法{开篇即冲突+信息差} |
| 霍庭煜对我没有爱。 我默然抽回了手。 该放弃自己的执念了。 |
N2 认清对方无爱,决意放弃执念 类型{情绪} · 情绪{心酸}{−5} |
同一份产出里,写作手法.md 直接点出原作的代价:
POV 代价:男主的转变缺乏过程展示,N47 的内心独白集中倒出「早就原谅、夜不能寐、深爱」, 略显直白说明(tell 多于 show)——这是第一人称追妻文的通病。
下游 /story-short-write 结合报告、情节节点、写作手法和原文构思新篇。
完整产出:demo/拆文库/曾将爱意私藏/
去 AI 味:逐条匹配已知句式
/story-deslop 的本地检查是写作 lint:逐条匹配已知句式模板,
给出行号、命中片段和改写方向。拿一段人工构造的 AI 腔样例扫描,8 处命中(7 blocking):
改前.md:7:20 [blocking] em-dash (么叫做命运的安排——不是巧合,而是一)
改前.md:7:22 [blocking] not-is-comparison (不是巧合,而是一种冥冥之中的注定)
改前.md:11:1 [blocking] negation-parade (没有犹豫,没有生涩,)
改前.md:19:3 [blocking] voice-contrast (声音不大,却)
改前.md:21:2 [blocking] not-is-comparison (不是一次简单的弹奏,而是一场蓄谋已久的惊艳亮相)
改前.md:3:1 [advisory] cliche-density-tic (仿佛 一丝 深吸一口气 缓缓 微微)
取第 21 章正文中的同一场戏跑同一个扫描:零命中,exit 0。 两段字数几乎一样,差别在于改前用抽象判词替读者定性,改后把同一件事交给可见的动作和物件。
完整对照与全部 8 条命中:demo/去AI味对照/
本地写作工作台与封面
运行 /story dashboard(Codex 用 $story dashboard)打开本地工作台,浏览拆文库与长短篇项目文件树,支持搜索、Markdown 预览、文本编辑、冲突保护保存和确认删除。顶栏可切换浅色、深色;服务仅监听 127.0.0.1,小说内容不会上传。
| 工作台 | /story-cover 生成的封面 |
|---|---|
![]() |
![]() |
安装后的第一条请求
按当前任务选一条请求,把〈占位内容〉换成自己的信息。
- 开一本新书
我想开一部〈类型/题材〉新书。先从我提供的材料中分开已确定事实与待决问题;只规划一个有边界的开篇,交付核心冲突、视角/信息释放限制、前三章变化和待决项。不要自动写正文;题材取舍、角色动机和长期方向留给我确认。
- 导入已有书稿
请把这份书稿整理成可续写项目。第 1–〈N〉章完整,〈文件名〉是第〈N+1〉章残稿;保留原文,不覆盖完整章节,不把残稿算作完整章,推断出的设定单列待确认。先交付识别范围、重建事实、冲突/歧义和待我确认的决定,供我审阅;暂不续写。
- 修一段不满意的正文
这段读起来〈空泛/重复/过度解释〉。先指出具体读感问题,保留故事事实、角色已知和未揭示边界;只交付这一段的修订建议、前后对照与理由,不全书改写。哪些建议采用由我决定。
流程总览
扫榜和拆文按需选用,也可以直接讨论结构、大纲;正式写入正文前,先完成项目部署。
flowchart LR
classDef entry fill:#f0f0f0,color:#333,stroke:#999,stroke-width:1px
classDef phase fill:#e8f4fd,color:#1a1a2e,stroke:#4a9be8,stroke-width:1px
classDef final fill:#fce4ec,color:#333,stroke:#e57373,stroke-width:1px
entry_l{{"长篇作者"}}:::entry
entry_s{{"短篇作者"}}:::entry
entry_r{{"已有方向"}}:::entry
entry_i{{"已有小说"}}:::entry
subgraph S0 [" 环境部署"]
setup["/story-setup"]:::phase
end
subgraph S1 [" 扫榜选材"]
direction TB
scan_l["长篇扫榜"]:::phase
scan_s["短篇扫榜"]:::phase
end
subgraph S2 [" 拆文学习"]
direction TB
analyze_l["长篇拆文"]:::phase
analyze_s["短篇拆文"]:::phase
import_l["已有小说导入"]:::phase
end
subgraph S3 [" 落笔创作"]
direction TB
write_l["长篇写作"]:::phase
write_s["短篇写作"]:::phase
end
subgraph S4 [" 精修定稿"]
deslop["去 AI 味"]:::final
end
entry_l --> setup
entry_s --> setup
setup --> scan_l
setup --> scan_s
scan_l --> analyze_l
scan_s --> analyze_s
analyze_l --> write_l
analyze_s --> write_s
entry_r -.->|直接规划| write_l
entry_r -.->|直接规划| write_s
entry_i -.->|推荐先部署| setup
setup -.->|逆向导入| import_l
import_l -.->|续写| write_l
write_l --> deslop
write_s --> deslop
Skills
先用这几个就够写书:装一次 story-setup,之后长篇用 story-long-write、短篇用 story-short-write,写完用 story-deslop 去 AI 味;拿不准叫哪个就说 /story 加一句话。
| Skill | 触发 | 说明 |
|---|---|---|
story-setup |
/story-setup $story-setup /准备写书 |
环境部署 · Claude/Antigravity/OpenCode/Codex/ZCode/OpenClaw/Reasonix + generic(已有配置安全合并) |
story |
/story $story /story dashboard |
工具箱路由 · 模糊意图与作者习惯请求分发 + 本地拆文/项目 Dashboard |
story-long-write |
/story-long-write /写长篇 |
长篇写作 · 大纲搭建、人物设定、正文输出、作者偏好管理 |
story-short-write |
/story-short-write /写短篇 |
短篇写作 · 情绪设计、反转构思、精修出稿、作者偏好管理 |
story-deslop |
/story-deslop /去AI味 |
去AI味 · 检测并清除 AI 写作痕迹 |
进阶:拆对标书、扫榜、导入旧稿、多视角审稿、封面,需要时再用。
| Skill | 触发 | 说明 |
|---|---|---|
story-long-analyze |
/story-long-analyze /长篇拆文 |
长篇拆文 · 黄金三章、爽点设计、节奏分析 |
story-long-scan |
/story-long-scan /长篇扫榜 |
长篇扫榜 · 起点/番茄/晋江市场趋势 |
story-short-analyze |
/story-short-analyze /短篇拆文 |
短篇拆文 · 故事核、结构分析、情感线、反转设计、写作手法、共鸣分析 |
story-short-scan |
/story-short-scan /短篇扫榜 |
短篇扫榜 · 知乎盐言/番茄短篇风口数据 |
story-import |
/story-import /导入小说 |
逆向导入 · 将已有小说反向解析为标准项目结构 |
story-review |
/story-review /审查 |
多视角审查 · full / lean / solo 模式 + 番茄/起点/知乎评分标准 |
story-cover |
/story-cover /封面 |
封面生成 · 书名题材分析 + GPT-Image-2(Codex 内置用量 / API 回退) |
browser-cdp |
/browser-cdp |
浏览器操控 · CDP 协议复用登录态抓取数据 |
story-deslop的本地检查是写作 lint:blocking 只限确定性句式/标点问题,其他提示按读感判断;朱雀等外部检测只作自测参考,不替代人工读感。
自然语言同样触发:
- 「帮我开书」→
story-long-write - 「这篇太 AI 了」→
story-deslop - 「把我的书导进来」→
story-import - 「打开工作台」→
story dashboard(本机浏览拆文库与写作项目,可轻量编辑) - 「记住我的写作习惯」→
story路由到对应写作 skill,由它管理作者记忆(原话证据、待确认、冲突替代) - 「沈栀现在什么状态」→ 检索项目资料,宿主支持时交给
story-explorer
工作原理
文件、专业 Agent 与 hooks 共同支持写作,细节见 工作原理:Agent、Hooks 与项目结构。
① 文件系统当记忆 — 一部长篇动辄几十万字。设定、大纲、正文、追踪拆成独立目录各自维护,
对话只负责创作,不负责记忆。追踪/ 下的 _tracking-state.json 是唯一结构化权威,
派生出上下文卡、伏笔视图、角色状态和「作者真相 / 读者已知」双时间线。
② 7 个专业 Agent 分工 — story-architect 负责架构,narrative-writer 写正文,consistency-checker 查一致性,
其余负责角色设计、资料研究、项目检索和逐章抽取。支持项目 Agent 的宿主由 /story-setup 部署,部署后新开会话;不支持的环境由主会话完成对应工作。
③ 写前门禁与写后校验 — 已接入正文守卫的宿主会在首次写正文缺对应大纲、或长篇追踪检查点不成立时拦截写入;写后检查截断和常见 AI 句式,确定性阻断问题会使章级检查无法通过。各宿主的 hooks、提醒和回退方式见部署说明。
各 skill 的 references/ 按当前任务加载,未读取的资料不占上下文。全部主题清单见 知识体系。
适用平台
长篇 起点中文网 · 番茄小说 · 晋江文学城 · 七猫小说 · 刺猬猫
短篇 知乎盐言故事 · 番茄短篇 · 七猫短篇
真实产出样例见 demo/:短篇拆文《曾将爱意私藏》· 长篇拆文《盘龙》· 长篇续写工程《让你管账号,你高燃混剪炸全网》· 封面《剑道独尊》示例图。
这套 skill 现在能让我度过找工作的过渡期 :joy:,希望也能帮到有需要的朋友。
常见问题
能在 Codex、Google Antigravity、OpenCode 里用吗,还是只支持 Claude Code?
oh-story-claudecode 内置适配 Claude Code、Google Antigravity、OpenCode、ZCode、OpenClaw、Codex CLI 和 Reasonix。Codex 会直接扫描仓库内 .agents/skills 发现 13 个 skill,用 $story-setup 调用;Antigravity 用 /skills 或自然语言运行 story-setup,它会自动识别当前宿主(target_cli=antigravity);OpenCode 需要 2.x,1.x 加载不了写正文守卫插件;能读取项目文件的 Web AI / Agent 环境也可以按通用 skills 路径使用。
需要 GPU 或自己部署模型吗?
不需要。oh-story-claudecode 是一组 skill,运行在你已经在用的编程 Agent 里,写作用的模型就是该 Agent 的模型;本地只跑确定性的检查脚本(Node / Python)。唯一的例外是 story-cover 封面生成,它调用 GPT-Image-2(Codex 内置用量或 API 回退)。
每章字数不统一、字数对不上怎么办?
从 v0.7.7 起,长篇正文只用一个机器统计的字数口径:每份细纲必须写明合法的「字数目标」,缺少时会停止而不是回退到 3000;欠字不会自动加戏,超字最多压缩一次。字数只由写作流程在交付前统一测量,写后 hook 不再提醒字数欠账。升级旧项目后重跑 /story-setup 并新开会话即可生效。
去AI味之后,朱雀等 AI 检测还是判定为 AI 怎么办?
story-deslop(/去AI味)用本地脚本检测已知句式、标点和退化痕迹,再由 Agent 结合上下文审读、改写。优化目标是读感;朱雀等外部检测只作自测参考。
可按这份具体改稿指南把空泛情绪、重复句式、拔高议论和过度解释分别处理,同时保留场景任务与作者设定;本仓库的实现细节见去AI味的具体做法。
已经写了一部分的小说,能导入后继续写吗?
可以。先在写作项目根运行 /story-setup,新开或刷新会话后运行 /story-import(/导入小说)把已有小说反向解析成标准项目结构,审阅反推结果,再用 /story-long-write 写第N章 续写(N 是导入后的下一章,会先补这一章的细纲);短篇导入后先补完构思再接着写。导入与续写指南说明了为什么书稿证据应优先于模型猜测。
长篇续写怎样减少忘伏笔或角色提前知道答案?
续写前分开故事客观事实、角色已知和读者已见,只带上本章相关的当前状态与未完承诺。长篇连续性指南给出三章示例,AI 写长篇小说怎么不崩人设:Oh Story 的做法说明本仓库的连续性机制。
章纲齐全,为什么写出来还是在复述设定?
把章纲当作“本章必须发生什么变化”的规格,再把目标、阻碍、证据、选择和代价转成视角人物可感知的行动与结果。章纲到章节指南给出编辑示例。
怎样保留我的文风,又不把另一本书的情节带进来?
把你自己写的或获准使用的短样本拆成表达维度,与当前书的事实分开讨论;样本推断不自动成为长期偏好。作者文风指南说明如何裁决当前要求、本书文风与作者偏好;样本只作表达参考,不复制原句。
Windows 上安装报 ENOENT ... mkdir,但末尾显示 Done,正常吗?
这是有技能没装全。无论有没有报错,重跑同一条安装命令即可修复;如果参考资料目录缺了一块,/story-setup 会提示参考资料包不完整。Codex 用户在 Windows 上还需要为 git 打开 core.symlinks。
升级到新版本后要做什么?
更新 skill 包后新开会话。若版本更新了项目内的 agents、hooks 或参考资料包,或你更换了编程 Agent,再在项目根重跑 /story-setup 并新开会话;具体版本要求见升级指南。
短篇和长篇的入口有什么区别?
长篇:/story-long-scan(扫榜)→ /story-long-analyze(拆文)→ /story-long-write(写作,含大纲、卷纲、细纲、正文)。短篇:/story-short-scan → /story-short-analyze → /story-short-write。两条线共用 /story-setup、/story-deslop、/story-review 和 /story-cover。
延伸阅读
- 提示词、技能包、插件与 MCP 怎么分 — 先选写作任务,再选 Agent 与流程
- 导入 10–20 章后接着写 — 审阅反推结果,以书稿证据为准
- 分开角色已知、承诺与线索 — 别把未来计划当成已发生事实
- 把剧情规格写成可见变化 — 用行动、选择、代价和结果推进
- 用具体改稿减少“AI 味” — 改读感,不追求鉴定分数
- 分开文风选择与本书事实 — 用自有或获准样本,不复制原句
- AI 写长篇小说怎么不崩人设:Oh Story 的做法 — 仓库内文档
- 去AI味的具体做法 — 仓库内文档
- 扫榜和拆文的自动化做法 — 仓库内文档
- Claude Code skills for writers — 仓库内文档(英文)
贡献
欢迎贡献新 skill、补充知识库、更新市场数据。详见 CONTRIBUTING.md。
交流
- Telegram 群:https://t.me/ohstoryclaudecode —— 日常交流、踩坑、新功能讨论。
- GitHub Discussions:提问 / 求助 / 分享用法,方便检索。
- GitHub Issues:Bug、输出质量 Case、功能请求,请按结构化表单提供复现材料或具体输出证据。
贡献者
致谢
- LINUX DO - The New Ideal Community — 社区支持
- FanqieRankTracker — 番茄小说字体反爬解码方案参考
- Zhuque AIGC Detector CLI — 去 AI 味实验中的外部复测工具参考
ZenStory AI 项目
Oh Story 是 ZenStory AI 的一部分——一组开源、面向 agent 的故事创作、改编与生产工具(GitHub 组织:zenstory-ai)。同组织项目:
| 项目 | 用途 |
|---|---|
| oh-story-claudecode | 网文写作 skill 包(本仓库) |
| drama-skills | AI 短剧 / 漫剧创作 skill 合集:剧本、资产、分镜、图片/视频提示词、独立审查 |
| novel-to-game | 面向原著改编、指定运行环境构建与运行证据 QA 的 agent skills |
| video-recap-skills | 将支持的视频文件制作成中文解说,可选导出可编辑的剪映/CapCut 草稿 |
| oh-story-dsh | DeepSeek Harness 社区插件,提供小说、短剧、游戏和视频解说工作台 |
| zenstory | 对话即创作的 AI 小说写作工作台(app.zenstory.ai) |
Oh Story
A skill pack for writing Chinese web fiction: chart scanning, deconstruction, drafting, de-AI-ify and cover art, running inside the coding agent you already use.
Project page · Install · FAQ · 中文
What it is
Oh Story covers the whole web-fiction pipeline, long-form and short: chart scanning → deconstructing bestsellers → outline and prose → de-AI editing → cover art. It installs as 13 skills into the coding agent you already use; the writing model is that agent's model. No GPU, no separate model setup.
- The file system is the memory — settings, outlines, prose and continuity tracking live in separate files. After context compaction or a session change, the workflow reloads progress, clues and unfinished commitments from those files.
- Deterministic checks and gates — long-form writing checks the blueprint and tracking before drafting, then checks truncation, engineering vocabulary and common AI phrasing. Hosts with hook support automate the relevant checks; other environments follow the skill workflow.
- Adapters for 7 coding agents — Claude Code · Codex CLI · Google Antigravity · OpenCode · ZCode · OpenClaw · Reasonix. Generic Web AI / agent environments that can read project files can also use the skills.
- Target platforms — Qidian, Fanqie, Jinjiang, Qimao, Zhihu Yanyan and other long/short-form Chinese platforms.
Trope = a reliable delivery of emotion.
Scan the charts for genres, characters and angles, then deconstruct a bestseller's pacing and plot techniques before shaping your own story with hooks, payoffs and anticipation. Settings, prose and continuity tracking live in separate files; the author chooses the direction, and the agent works from the agreed plan.
Installation
npx skills add zenstory-ai/oh-story-claudecode -y -g
-g installs globally for every directory; drop it to install into the current directory only. To update, run the same command again.
You can also just tell your agent (any platform that can import a GitHub repo or skill):
Install this skill https://github.com/zenstory-ai/oh-story-claudecode
Then run /story-setup from your writing-project root ($story-setup in Codex) to deploy the hooks / agents / references supported by your host, and start a fresh session.
You can also search ClawHub; this repository's published scope is listed in the ClawHub inventory.
Per-host deployment differences, known limits and install troubleshooting (Windows
ENOENT, Antigravityagy -p, leftover directories) are in Host deployment and install troubleshooting. Versions and changes are listed in CHANGELOG.md and Releases. Existing projects should follow the upgrade guide (Chinese).
See what it produces
The examples below include real skill outputs and a deliberately constructed AI-flavored test passage. Full files are in demo/.
The continuity card: keeping the current state in files
The novel below is the project author's own; /story-import rebuilt the 20 published chapters
into a continuable project. This is the continuity card as it stood before chapter 21 was written.
/story-long-write reads the continuity summary from 追踪/上下文.md: 7 fixed sections with a 12 KiB cap. The main session selects relevant state for the writer without inserting the full card into the writer's prompt. The blueprint, relevant settings and necessary character cards are still read for the task:
## Current position
- Chapter 20 · Volume 1 · Story time: the day after "如愿" passed 100M views
## Standing constraints
- Propaganda payoffs must land through the work's real effect, reach data and bystander reaction —
never through a system announcement alone.
- Zhong Jiajia's undisclosed military background is author-truth; it cannot be treated as
reader-known until the prose reveals it.
## Live foreshadowing
- F016|Zhong Jiajia is not an ordinary intern reporter|planted ch.7|payoff TBD|high
- F049|Wu Wei has received a criminal summons; the legal outcome has not landed|planted ch.18|high
- F054|A veteran invited Jiang Chen to hear his story — an entry point for later work|planted ch.20|high
## Promises for the next chapter
- Write the ch.21 blueprint first, then pick up the veteran's invitation, the new backing track
and the piano skill.
Author-truth and reader-known are tracked separately to check whether a character knows an answer too early or a clue has already been revealed.
Full file: demo/长篇/.../追踪/上下文.md
Continuing into chapter 21: gate to write-back, end to end
The video above is this exact session. What /story-long-write 写第21章 produced, and every check on the way:
Blueprint 细纲_第021章.md tracking said "no blueprint for ch.21", so the skill wrote one first: unit L1-03, target emotion, stakes, loop state, a 10-row four-column plot table (plus the optional resolution column)
Chapter check storyctl.py chapter check ready · 2068 chars / target 2300
├ check-ai-patterns.js 0 hits
├ check-degeneration.js 0 hits
└ normalize-punctuation 0 hits
Tracking commit storyctl.py chapter commit tracking_committed=true · state_revision 0 → 1
Derived views tracking_commit.py check 上下文.md / 伏笔.md / 角色状态/ / 时间线/ / 逐章记录/ all re-rendered from state, byte-identical
The workflow checks the blueprint and tracking before drafting. Once the blueprint passes structural checks, narrative-writer drafts in two batches. Facts and clues are checked before a single-chapter commit; daily batches check any remaining chapters at the end. An additional de-AI review runs when readability needs attention. The deterministic closing scripts and chapter check run before delivery.
After the commit, tracking state is re-rendered in full from _tracking-state.json; hand-editing a derived view is
rejected by check. Against the card above, this is what the write-back changed (excerpt; the rolling recent-chapter
digest and character snapshots are omitted):
## Current position
-- Chapter 20 · Scene: the propaganda troupe, after Zhong Jiajia delivers the veterans' calligraphy
+- Chapter 21 · Scene: the troupe office, after Jiang Chen receives Tan Shouyi's address
## Live foreshadowing
-- F054|A veteran invited Jiang Chen to hear his story|planted ch.20|payoff TBD|high
+- F054|Tan Shouyi has sent his address; Jiang Chen will visit tomorrow|planted ch.20|payoff ch.22|high
+- F057|Tan Shouyi has a story "fifty years long that no one has heard to the end"; contents unrevealed|planted ch.21|payoff ch.22|high
+- F058|Task three: a "farewell" piece, 10M+ heat on open day, 14-day limit|planted ch.21|payoff ch.27|high
## Promises for the next chapter
-- Write the ch.21 blueprint first, then pick up the veteran's invitation, the backing track and the piano skill.
+- Jiang Chen asks for leave, travels to the neighbouring city to hear Tan Shouyi's full story and records it; F057 revealed.
## Continuity risks
-- Chapter 21 has no blueprint yet; prose cannot be written directly.
+- The truth behind Tan Shouyi's story is a candidate (E015); the author may change it before the ch.22 blueprint; not reader-known until revealed.
The new character Tan Shouyi gets his own setting card and character-state file; the candidate truth behind his story
(E015) sits in 时间线/作者真相.md marked unrevealed, while 读者已知.md holds only the one line Jiang Chen has read.
The retired risk line was written into 逐章记录/第021章.md under "本章退役登记" — state never vanishes silently.
Output: 正文/第021章_离别怎么会开花.md
· 大纲/细纲_第021章.md
· 设定/角色/谭守义.md
· 追踪/逐章记录/第021章.md
A deconstruction report: scores that come with reasons
/story-long-analyze on the first 23 chapters of Coiling Dragon (~62k characters, a Qidian classic
used purely as analysis input), scored against
the taste of a Fanqie male-oriented progression-fantasy reader:
| Dimension | Score | Note (excerpt) |
|---|---|---|
| Opening hook | 2 | The first 500 characters are pure geography plus a morning-drill ensemble — no suspense, conflict or contrast. Immersion is solid, immediate pull is weak. |
| Protagonist | 4 | Named late (paragraph 60), introduced through others' astonishment; "declining noble house + six-year-old prodigy" sets the contrast. The strongest of the three chapters. |
| Payoff design | 1 | Zero conventional payoffs across three chapters; gratification is deliberately delayed to the chapter-18 cheat item, betting on compounding immersion. |
Overall: an extreme structure — strong on character, zero on payoff. Copying this opening would lose Fanqie readers, but the local techniques it yields (exposition through a mentor, delayed naming, externalising resolve through the body) are highly reusable.
Full report: demo/拆文库/盘龙/拆文报告.md
Short-form deconstruction: turning your own story into reusable modules
/story-short-analyze on 曾将爱意私藏 — the project author's own short story (~8,500 characters,
"chasing wife" / faked-death genre) — yields 54 plot nodes and 11 technique notes. Every node is
anchored to the source text and tagged with emotion type and intensity (−9 to +9):
| Source text | Extracted structure |
|---|---|
| 「霍总还不打算让沈暮月母子进门吗?」 「没必要,私生子而已。」 我正准备推门而入,听到这话,手停在了半空。 |
N1 Overhears "just a bastard child" at the door type{information} · emotion{shock}{−7} technique{open on conflict + information gap} |
| 霍庭煜对我没有爱。 我默然抽回了手。 该放弃自己的执念了。 |
N2 Accepts he does not love her; resolves to let go type{emotion} · emotion{bitterness}{−5} |
In the same output, 写作手法.md names what the original costs:
POV cost: the male lead's turn is never dramatised; the interior monologue at N47 dumps "long forgiven, sleepless, deeply in love" all at once — telling rather than showing, the standard weakness of first-person stories in this genre.
/story-short-write uses the report, plot nodes, technique notes and source text to plan a new story.
Full output: demo/拆文库/曾将爱意私藏/
De-AI editing: rule-by-rule matching
The local check in /story-deslop is a writing lint. It matches known sentence templates and returns the line, the span and a rewrite
direction. Scanning a hand-constructed AI-flavored sample returns 8 findings (7 blocking):
改前.md:7:20 [blocking] em-dash (么叫做命运的安排——不是巧合,而是一)
改前.md:7:22 [blocking] not-is-comparison (不是巧合,而是一种冥冥之中的注定)
改前.md:11:1 [blocking] negation-parade (没有犹豫,没有生涩,)
改前.md:19:3 [blocking] voice-contrast (声音不大,却)
改前.md:21:2 [blocking] not-is-comparison (不是一次简单的弹奏,而是一场蓄谋已久的惊艳亮相)
改前.md:3:1 [advisory] cliche-density-tic (仿佛 一丝 深吸一口气 缓缓 微微)
The corresponding passage from chapter 21 scans zero findings, exit 0. Both passages are nearly the same length; the difference is that the first tells the reader what to feel, and the second hands the same beat to visible action and objects.
Full comparison and all 8 findings: demo/去AI味对照/
Local workbench and covers
Run /story dashboard ($story dashboard in Codex) to browse deconstruction libraries and long/short project trees. The local workbench supports search, Markdown previews, text editing, conflict-protected saves and confirmed deletion, with light and dark themes. It listens only on 127.0.0.1 and never uploads story content.
| Workbench | Cover from /story-cover |
|---|---|
![]() |
![]() |
Your First Request
Choose the request that fits your task and replace the 〈placeholders〉.
- Start a new book
I want to start a new 〈genre/premise〉 book. First separate fixed facts in my material from decisions that remain open. Plan only a bounded opening and deliver the central conflict, viewpoint/information-release limits, changes across the first three chapters and open decisions. Do not draft prose automatically; leave genre tradeoffs, character motives and the long-term direction for me to confirm.
- Import an existing manuscript
Organize this manuscript as a continuable project. Chapters 1–〈N〉 are complete; 〈filename〉 is a partial chapter 〈N+1〉. Preserve the source prose, do not overwrite complete chapters, and do not count the fragment as a complete chapter, and separate inferred settings for confirmation. First deliver the detected range, reconstructed facts, conflicts/ambiguities and decisions requiring my confirmation for review; do not continue the story yet.
- Fix an unsatisfactory passage
This passage reads as 〈vague/repetitive/over-explained〉. First name the specific reading problem while preserving story facts, character knowledge and unrevealed information. Deliver only a proposed revision of this passage, a before/after comparison and reasons—not a book-wide rewrite. I will decide which suggestions to accept.
Pipeline Overview
Chart scanning and deconstruction are optional; you can start by discussing structure and outlines. Set up the project before writing prose files.
flowchart LR
classDef entry fill:#f0f0f0,color:#333,stroke:#999,stroke-width:1px
classDef phase fill:#e8f4fd,color:#1a1a2e,stroke:#4a9be8,stroke-width:1px
classDef final fill:#fce4ec,color:#333,stroke:#e57373,stroke-width:1px
entry_l{{"Long-form Author"}}:::entry
entry_s{{"Short-form Author"}}:::entry
entry_r{{"Has an Idea"}}:::entry
entry_i{{"Existing Novel"}}:::entry
subgraph S0 [" Setup"]
setup["/story-setup"]:::phase
end
subgraph S1 [" Trend Scanning"]
direction TB
scan_l["Long-form Scan"]:::phase
scan_s["Short-form Scan"]:::phase
end
subgraph S2 [" Deconstruction"]
direction TB
analyze_l["Long-form Deconstruction"]:::phase
analyze_s["Short-form Deconstruction"]:::phase
import_l["Existing Novel Import"]:::phase
end
subgraph S3 [" Writing"]
direction TB
write_l["Long-form Write"]:::phase
write_s["Short-form Write"]:::phase
end
subgraph S4 [" Polish"]
deslop["De-AI-ify"]:::final
end
entry_l --> setup
entry_s --> setup
setup --> scan_l
setup --> scan_s
scan_l --> analyze_l
scan_s --> analyze_s
analyze_l --> write_l
analyze_s --> write_s
entry_r -.->|Plan Directly| write_l
entry_r -.->|Plan Directly| write_s
entry_i -.->|Setup Recommended| setup
setup -.->|Reverse Import| import_l
import_l -.->|Continue Writing| write_l
write_l --> deslop
write_s --> deslop
Skills
These are enough to write a book: run story-setup once, then story-long-write for serials or story-short-write for short stories, and story-deslop to clean up AI tells; if unsure which to call, say /story plus one sentence.
| Skill | Trigger | Description |
|---|---|---|
story-setup |
/story-setup / $story-setup |
Environment setup — Claude/Antigravity/OpenCode/Codex/ZCode/OpenClaw/Reasonix plus generic (safe merge) |
story |
/story / $story / /story dashboard |
Routes general intent and author-preference requests; local deconstruction/project dashboard |
story-long-write |
/story-long-write |
Long-form writing — outline building, character design, prose output, author-preference management |
story-short-write |
/story-short-write |
Short-form writing — emotion design, twist crafting, polish & delivery, author-preference management |
story-deslop |
/story-deslop |
De-AI-ify — detect and remove AI writing traces |
Advanced: benchmark deconstruction, trend scans, importing drafts, multi-perspective review and covers, when you need them.
| Skill | Trigger | Description |
|---|---|---|
story-long-analyze |
/story-long-analyze |
Long-form deconstruction — Golden First 3 Chapters, payoff design, pacing analysis |
story-long-scan |
/story-long-scan |
Long-form trend scan — Qidian/Fanqie/Jinjiang market trends |
story-short-analyze |
/story-short-analyze |
Short-form deconstruction — story core, structure, emotional arc, reversal design, writing techniques, resonance analysis |
story-short-scan |
/story-short-scan |
Short-form trend scan — Zhihu Yanyan/Fanqie short-form trending data |
story-import |
/story-import |
Reverse import — parse existing novels into standard project structure |
story-review |
/story-review |
Multi-perspective review — full / lean / solo modes with Fanqie/Qidian/Zhihu scoring rubrics |
story-cover |
/story-cover |
Cover generation — title/genre analysis + GPT-Image-2 via Codex included usage or API fallback |
browser-cdp |
/browser-cdp |
Browser control — CDP protocol for scraping with reusable login sessions |
story-deslopuses local prose linting: blocking applies only to deterministic style/punctuation issues, while other findings require read-through judgment; external detectors such as Zhuque are self-check references, not replacements for human review.
Natural language also triggers: 帮我开书 ("help me start writing") → story-long-write, 这篇太AI了 ("this is too AI-ish") → story-deslop, 把我的书导进来 ("import my book") → story-import, 打开工作台 ("open the dashboard") → story dashboard, 记住我的写作习惯 ("remember my writing habits") → story, which routes the request to the appropriate writing skill to manage author memory. Asking 沈栀现在什么状态 ("what's Shen Zhi's current status") searches project files, using story-explorer when the host supports it.
How it works
Files, specialist agents and hooks support the writing workflow. Full detail in How it works: agents, hooks and project structure.
1. The file system is the memory — a long novel runs to hundreds of thousands of characters.
Settings, outlines, prose and tracking live in separate directories, each maintained independently;
the conversation writes, it does not remember. 追踪/_tracking-state.json is the single structured
authority, deriving the context card, foreshadowing view, character states and the
author-truth / reader-known dual timeline.
2. Seven specialist agents — story-architect handles structure, narrative-writer drafts prose, and consistency-checker checks continuity. The others handle characters, research, project retrieval and chapter extraction. On hosts that support project agents, /story-setup deploys them; start a fresh session after deployment. Other environments perform the same work in the main session.
3. Pre-write gates and post-write checks — hosts with the prose guard block first creation when the matching outline is missing, and block long-form writes when the tracking checkpoint is invalid. Post-write checks flag truncation and common AI phrasing; deterministic blocking findings prevent the chapter check from passing. See host deployment details for each host's hooks, reminders and fallback behavior.
Each skill loads references/ for the current task; unread references consume no context. The full topic list is in Knowledge base.
Supported Platforms
Long-form Qidian (起点中文网) · Fanqie Novels (番茄小说) · Jinjiang (晋江文学城) · Qimao (七猫小说) · Ciweimao (刺猬猫)
Short-form Zhihu Yanyan (知乎盐言故事) · Fanqie Short-form (番茄短篇) · Qimao Short-form (七猫短篇)
Real output samples are in demo/: short-form deconstruction 《曾将爱意私藏》 · long-form deconstruction 《盘龙》 · long-form continuation project 《让你管账号,你高燃混剪炸全网》 · cover sample 《剑道独尊》.
I built this skill pack to help me through a job-hunting transition :joy:, and I hope it can help others too.
FAQ
Does it work in Codex, Google Antigravity or OpenCode, or only in Claude Code?
oh-story-claudecode ships adapters for Claude Code, Google Antigravity, OpenCode, ZCode, OpenClaw, Codex CLI and Reasonix. Codex discovers the 13 skills by scanning .agents/skills in the repo and invokes them with $story-setup; in Antigravity run story-setup via /skills or natural language; it detects the current host (target_cli=antigravity) on its own. OpenCode needs 2.x, since 1.x cannot load the prose-guard plugin. Any Web AI or agent environment that can read project files can use the generic skills path.
Do I need a GPU or to host a model?
No. oh-story-claudecode is a set of skills that runs inside the coding agent you already use, so the writing model is that agent's model; only deterministic check scripts (Node / Python) run locally. The one exception is story-cover, which calls GPT-Image-2 (Codex built-in quota or an API fallback).
Chapter lengths are inconsistent or the word count is off. What do I do?
Since v0.7.7 long-form prose uses a single machine-counted length metric: every chapter blueprint must state a valid word target, and a missing target stops the run instead of falling back to 3,000; under-length chapters are not padded with new plot, and over-length chapters get at most one compression pass. Length is measured once by the writing workflow before delivery; the post-write hook no longer flags length debt. Rerun /story-setup and start a new session after upgrading an older project.
After de-AI editing, detectors such as Zhuque still flag the text as AI. Why?
story-deslop (/去AI味) uses local scripts to detect known sentence patterns, punctuation habits and degeneration artifacts. The agent then reviews and rewrites passages in context to improve how they read; external detectors are a self-check reference.
This concrete revision guide separates vague emotion, repeated syntax, unearned commentary and over-explaining while preserving the scene's job and the author's facts; this repository's own mechanism is described in 去AI味的具体做法 (Chinese).
I already have part of a novel written. Can I import it and continue?
Yes. Run /story-setup in the project root, start or refresh a session, run /story-import to reverse-parse the existing novel into the standard project layout, review its inferences, then continue with /story-long-write 写第N章, where N is the first chapter after the imported ones (it drafts that chapter's outline first); for a short story, finish its planning (say 「补完构思」 to /story-short-write) before writing on. The import-and-continue guide explains why manuscript evidence should take priority over model guesses.
How do I reduce forgotten clues or characters knowing answers too early in a long continuation?
Before continuing, separate objective story facts, character knowledge and what readers have seen; carry only the relevant current state and unfinished commitments into the chapter. The long-novel continuity guide gives a three-chapter example; Keep an AI-written novel consistent over 100+ chapters describes how this repository tracks continuity.
My chapter outline is complete. Why does the prose still summarize the setup?
Treat the outline as a specification for what must change, then turn its goal, obstacle, evidence, choice and cost into actions and results the viewpoint character can perceive. The outline-to-chapter guide walks through an editorial example.
How do I keep my voice without carrying plot facts over from another book?
Describe the dimensions of a short sample you wrote or may use, separately from the current book's facts; sample inference does not automatically establish an enduring preference. The author-voice guide explains how to resolve the current request, book style and author preferences; use samples as a reference for expression and never copy sentences.
On Windows the install prints ENOENT ... mkdir but ends with Done. Is that normal?
It means some skills were not fully installed. Rerun the same install command, with or without the error, and it repairs itself; if a reference-material directory is missing, /story-setup reports the reference pack as incomplete. Codex users on Windows also need core.symlinks enabled in git.
What do I do after upgrading?
Start a fresh session after updating the skill pack. If the release changes project agents, hooks or reference bundles, or you switch coding agents, rerun /story-setup from the project root and then start a fresh session. See the upgrade guide (Chinese) for version-specific requirements.
What is the difference between the short-form and long-form entry points?
Long-form: /story-long-scan (chart scanning) → /story-long-analyze (deconstruction) → /story-long-write (outline, volume outline, chapter blueprints, prose). Short-form: /story-short-scan → /story-short-analyze → /story-short-write. Both share /story-setup, /story-deslop, /story-review and /story-cover.
Further reading
- Prompts, skill packs, plugins and MCP — choose the writing job before the host and workflow
- Import 10–20 chapters and continue — review inferred structure; treat the manuscript as evidence
- Separate character knowledge, promises and clues — do not turn future plans into past events
- Write plot specifications as visible change — advance through action, choice, cost and result
- Reduce "AI-sounding" prose with concrete edits — improve the reading experience, not a detector score
- Separate voice choices from book facts — use authorized samples without copying phrases
- Keep an AI-written novel consistent over 100+ chapters — in-repo doc
- Claude Code skills that are not for coding: a fiction-writing pack as the worked example — in-repo doc
- 去AI味的具体做法 — in-repo doc (Chinese)
- 扫榜和拆文的自动化做法 — in-repo doc (Chinese)
Contributing
Contributions are welcome — new skills, knowledge base additions, market data updates. See CONTRIBUTING.md (Chinese only).
Community
- Telegram: https://t.me/ohstoryclaudecode — chat, troubleshooting, and feature discussion.
- GitHub Discussions: ask questions, get help, share workflows.
- GitHub Issues: bugs, output-quality cases, and feature requests. Use the structured forms and include reproducible evidence or a concrete output sample.
Contributors
Acknowledgments
- LINUX DO - The New Ideal Community — Community support
- FanqieRankTracker — Fanqie Novels font obfuscation decoding reference
- Zhuque AIGC Detector CLI — External retest reference used during anti-AI-writing experiments
Part of ZenStory AI
Oh Story is part of ZenStory AI — open-source, agent-native tools for creating, adapting and producing stories (GitHub org: zenstory-ai). Sibling projects:
| Project | What it does |
|---|---|
| oh-story-claudecode | Web-fiction writing skill pack (this repo) |
| drama-skills | AI short-drama / motion-comic suite: scripts, assets, storyboards, image & video prompts, independent review |
| novel-to-game | Agent skills for source-grounded novel adaptation, target-runtime builds, and evidence-based QA |
| video-recap-skills | Create Chinese-narration recaps from supported video files, with optional editable JianYing/CapCut draft export |
| oh-story-dsh | Community DeepSeek Harness plugin with novel, short-drama, game and video-recap workbenches |
| zenstory | Chat-to-create AI novel-writing workbench (app.zenstory.ai) |

