#175 by GitHub stars

zenstory-ai/oh-story-claudecode

AI 写网文全流程 skill 包:扫榜选材、拆解爆款、大纲细纲、长篇设定与伏笔追踪、短篇反转、去AI味与封面生成,适配 Claude Code / Codex / Antigravity / OpenCode 等 | Agent skill pack for writing Chinese web novels

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

skills/browser-cdp/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Local scripts → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story/SKILL.md

Week of Nov 2, 2026 · +1 / −1 lines

Before Network or broad shell → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 105 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**;同时用一句白话提示作者「查资料助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进回答最末一行「技术备注:」;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
+ 105 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 40` 不一致时(标记缺失、字段缺失/非整数、小于或大于 40)**照常按当前宿主角色来源检查并 spawn**;同时用一句白话提示作者「查资料助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 40)` 原文写进回答最末一行「技术备注:」;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-cover/SKILL.md

Week of Nov 2, 2026 · +8 / −8 lines

Before Network or broad shell → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 17 - **Codex 内置(优先)**:当前 Codex CLI 会话可调用 `$imagegen` / `image_gen` 时,直接调用工具生成并保存,无需 `OPENAI_API_KEY` 或 `GPT_IMAGE_API_KEY`,不运行 `curl`。
- 18 - **API 回退**:仅在会话没有内置工具或用户明确指定 API 时使用,需要 `GPT_IMAGE_API_KEY`;环境变量和命令在 [references/api-fallback.md](references/api-fallback.md),走这条通路时再读。工具缺失不等于 Codex 订阅不支持生图;内置调用失败时先报告错误,不静默切换到可能收费的 API。
+ 17 - **内置生图(优先)**:当前会话可调 Codex `$imagegen` / `image_gen` 或 Antigravity `generate_image` / `image-generator` 时,直接调用生成并保存,无需 `OPENAI_API_KEY` 或 `GPT_IMAGE_API_KEY`,不跑 `curl`。
+ 18 - **API 回退**:仅在无内置工具或用户指定 API 时使用,需 `GPT_IMAGE_API_KEY`;变量和命令见 [references/api-fallback.md](references/api-fallback.md),走该通路再读。工具缺失不等于订阅不支持生图;内置失败先报错,不静默切到收费 API。
- 27 - 短篇:`设定.md`「基本信息」的标题、目标平台、目标情绪,以及「一句话梗概」「题材招式」。
+ 27 - 短篇:`设定.md`「基本信息」的标题、目标平台、目标情绪,以及「一句话梗概」「这篇用的套路」(旧书叫「题材招式」)。
- 45 1. 有「题材类型」(长篇)或梗概、题材招式(短篇)时,按内容选风格库中最接近的一节。
+ 45 1. 有「题材类型」(长篇)或梗概、套路(短篇)时,按内容选风格库中最接近的一节。
- 86 #### Codex 内置 ImageGen(优先)
+ 86 #### 内置生图(Codex / Antigravity,优先)
- 88 1. 用 Step 3 的完整提示词调用 `image_gen`。比例和安全区写进提示词,不传 `GPT_IMAGE_MODEL`、`GPT_IMAGE_SIZE`、`response_format` 等 API 参数。
- 89 2. 有 `REF_IMAGE` 时,本地文件先用图片查看工具载入会话;URL 先下载再载入。说明它是编辑目标还是风格参考,并列出必须保持的内容。
- 90 3. 先创建 `BOOK_DIR/封面/`,再把工具返回的图片复制为 `封面_vN.png`,`N` 自增且不覆盖旧版;保留 `$CODEX_HOME/generated_images/` 原文件,同时保存同名 `.prompt.txt`,有参考图再保存 `.ref.txt`。确认图片可读,并把原图绝对路径交给 Step 5。
+ 88 1. 用 Step 3 的完整提示词调用 `image_gen`(Codex)或 `generate_image` / `image-generator`(Antigravity)。比例和安全区写进提示词,不传 `GPT_IMAGE_MODEL`、`GPT_IMAGE_SIZE`、`response_format` 等 API 参数。
+ 89 2. 有 `REF_IMAGE` 时,本地文件先载入会话(或传给 `image-generator`);URL 先下载再载入。说明是编辑目标还是风格参考,并列出须保持的内容。
+ 90 3. 先创建 `BOOK_DIR/封面/`,把生成的图片复制为 `封面_vN.png`(`N` 自增不覆盖旧版);保留 `$CODEX_HOME/generated_images/` 等原文件,并存同名 `.prompt.txt`(有参考图再存 `.ref.txt`)。确认可读后把原图绝对路径交给 Step 5。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-deslop/SKILL.md

Week of Nov 2, 2026 · +3 / −3 lines

Before Local scripts → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 32 从正文路径确定书目录和篇幅:单个 `正文.md` 一般是短篇,`正文/` 下逐章文件一般是长篇;优先采用作者与项目的明确说明。按开头的文风裁决读本书要求,通读本次正文,按需查相关前文和已定设计,不整读无关全书。资料缺失时继续有依据的部分,标明未知。本次涉及多章时,逐章完成 Phase 1–4 再进下一章,交给写手时每章派一次。
+ 32 从正文路径确定书目录和篇幅:单个 `正文.md` 一般是短篇,`正文/` 下逐章文件一般是长篇;优先采用作者与项目的明确说明;短篇另读 [references/short-deslop.md](references/short-deslop.md) 的卖点保护。按开头的文风裁决读本书要求,通读本次正文,按需查相关前文和已定设计,不整读无关全书。资料缺失时继续有依据的部分,标明未知。本次涉及多章时,逐章完成 Phase 1–4 再进下一章,交给写手时每章派一次。
- 78 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进技术备注行;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
+ 78 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 40` 不一致时(标记缺失、字段缺失/非整数、小于或大于 40)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 40)` 原文写进技术备注行;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
- 109 标点脚本把白名单以外的省略号、破折号、双连字符换成逗号、句号、冒号或删去,并删除独立分隔线;不动问号和感叹号,默认不改引号。仅作者或项目明确要求时才加 `--quote-mode ascii` 或 `--quote-mode yan`。白名单登记按文风裁决文件执行,不因脚本报警自行放行。
+ 109 标点脚本保留引号里的省略号(统一成 `……`),把白名单以外的其余省略号、破折号、双连字符换成逗号、句号、冒号或删去,并删除独立分隔线;不动问号和感叹号,默认不改引号。仅作者或项目明确要求时才加 `--quote-mode ascii` 或 `--quote-mode yan`。白名单登记按文风裁决文件执行,不因脚本报警自行放行。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-import/SKILL.md

Week of Nov 2, 2026 · +1 / −1 lines

Before Local scripts → After Local scripts

cc6397f2b071 → 7383fd6cd8ac

- 13 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「分析助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进汇报最后一行「技术备注:」;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: project custom agents unavailable -> solo` 同样只进技术备注行。
+ 13 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 40` 不一致时(标记缺失、字段缺失/非整数、小于或大于 40)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「分析助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 40)` 原文写进汇报最后一行「技术备注:」;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: project custom agents unavailable -> solo` 同样只进技术备注行。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-long-analyze/SKILL.md

Week of Nov 2, 2026 · +1 / −1 lines

Before Local scripts → After Local scripts

cc6397f2b071 → 7383fd6cd8ac

- 15 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)照常按当前宿主角色来源检查并 spawn,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 并提示重新运行 `/story-setup` 后新开会话;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct。
+ 15 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 40` 不一致时(标记缺失、字段缺失/非整数、小于或大于 40)照常按当前宿主角色来源检查并 spawn,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 40)` 并提示重新运行 `/story-setup` 后新开会话;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-long-scan/SKILL.md

Week of Nov 2, 2026 · +1 / −1 lines

Before Network or broad shell → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 59 4. 看聚合的「采集情况」:标了问题(书名没解出来、没采到、只有书单、详情没取到)的榜单,按平台参考的「采不到时」排查后重采;重采不了,报告里说明结论不含它。
+ 59 4. 看聚合的「采集情况」:标了问题(书名没解出来、没采到、只有书单、详情没取到)的榜单,按平台参考的「采不到时」排查后重采;重采不了,报告里说明结论不含它。只缺热度数字的榜不算采不到:题材、字数照用,只是不进热度结论。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-long-write/SKILL.md

Week of Nov 2, 2026 · +45 / −47 lines

Before Local scripts → After Local scripts

cc6397f2b071 → 7383fd6cd8ac

- 13 任何创建或修改长篇故事文件的动作前,先判断场景并读完下列文件。**只读本 SKILL.md 不算完成;`rg` 检索或局部摘读也不算完整读取。**
+ 13 创建或修改长篇故事文件前,按下表读完当前时刻的文件(这张表是唯一的读取清单);只读本文件、`rg` 检索或摘读都不算。**按节读只允许两种**:任务包切好的节,或本表、文件内「什么时候读这份」点名的节;其余文件整份读到结尾。缺文件或没读完就停,报准确路径,**不得先写正文再补读**;每个任务、每个会话重新读。
- 15 必须分块读到 EOF:
+ 15 | 时刻 | 必读 | 条件满足才读 |
+ 16 |---|---|---|
+ 17 | 定方向 | `workflow-setup.md` | 没方向:`long-genre-catalog.md`(特殊题材只读对应一节);女频改读 `female-audience-writing.md`;平台、赛道、暂定书名:`genre-readers.md`;派子代理:`agent-calls.md` |
+ 18 | 定设定 | `workflow-setup.md`;自己做加 `character-basics.md`、`reader-contract-and-progression.md`、`long-genre-mechanics.md`「核心梗三层递进设计」「金手指」、`character-relations.md`「人物关系类型」 | 女频:`female-audience-writing.md`;有感情线:`character-relations.md`「感情线阶段」;对标登记 ≥2 本:`cross-book-recall.md` |
+ 19 | 出卷纲 | `workflow-volume.md`;自己排加 `artifact-protocols.md`、`outline-methods.md`「卷纲排法」、`reader-contract-and-progression.md` | 没有主对标:outline-methods「常见的八步结构」;有自创剧情段:「情绪模块公式」;换地图:「换地图」;有反转:`long-reversal.md`「反转类型」;感情线、对标同上 |
+ 20 | 出细纲、补纲 | `workflow-outline.md`;自己出加 `outline-template.md`、`plot-core-methods.md`、`character-basics.md`、`long-chapter-hooks.md`「章尾钩子 13 式」「章首钩子 7 式」 | 含前 3 章:`opening-design.md`「开篇规划」;感情线、对标同上 |
+ 21 | 写一章 | `workflow-chapter.md`;交写手加 `agent-calls.md`;自己写加 `long-format.md`、`writing-craft.md`、本章技法 | 新书第 1 章:`tracking-initialization.md`、`genre-prose-cards.md`「全书题材正文提示卡」与核对报告点名的卡;召回降档不成立:`benchmark-recall.md`;缺文件、找产物放哪:`project-files.md`;自己写第 1-3 章:`opening-design.md`「开篇落笔」;排查单章问题:`long-chapter-quality.md` |
+ 22 | 日更 | 先 `workflow-daily.md`,每章同「写一章」 | 同「写一章」 |
+ 23 | 大修 | `workflow-revision.md`;交写手加 `agent-calls.md`;自己改加 `long-format.md`、`writing-craft.md`,改情绪对抗戏加本章技法 | 只说读者反应:`revision-diagnosis.md`;追踪提交报错:`tracking-transaction.md` |
+ 24 | 管理作者习惯 | `author-memory.md`;完成即停,不建书、不写正文 | — |
- 17 1. 规划按时刻读:定方向、定设定读 `references/workflow-setup.md`,出卷纲读 `references/workflow-volume.md`,出细纲或补纲读 `references/workflow-outline.md`,只读当前时刻的;写指定章读取 `references/workflow-chapter.md`;日更先读取 `references/workflow-daily.md`,进入正文前再完整读取 `workflow-chapter.md`;大修先读 `references/workflow-revision.md`,改稿时还要读什么由它写明。
- 18 2. 主会话直接写正文时,首次落笔前完整读取 `references/long-format.md` 与 `references/writing-craft.md`,与写手用同一套技法;`references/long-chapter-quality.md` 只在排查具体问题时读,去味走检测器,不预读。交给 narrative-writer 时,由该 agent 按自己的 reference 表完成写前读取,主会话不得用未读 reference 的临时 prompt 替代。
- 19 3. 本章技法按下方「本章技法」一段选,至多一份;主会话自己写时按那段只读指定小节,这是本条唯一允许的按节读。
- 20 4. 正文写前,references 读完后立即重读当前用户请求、本章细纲和卷纲,先在上下文里**记下本轮约束**:原样记录用户明确字数范围、必发生、禁止发生、精确时间锚与本章停笔点、章尾新债。references 只提供技法,不得覆盖这些项目事实;作者给的字数范围写在细纲「字数范围」行(命令参数只作临时覆盖),有它就不用默认 ±15%。交付前逐项复核:字数带外按 `workflow-chapter.md` 的收口流程交用户处置,不自动补字;其余项越界不算完成。
+ 26 交给 story-architect 时主会话只读时刻文件和 `agent-calls.md`,方法随任务包;交给 narrative-writer 时它按自己的读取表读,不得用没读参考的临时 prompt 替代。去味走检测器,不预读。写正文、改稿前读本书 `设定/文风.md`(没有就按作者当前请求)。
- 22 任一必需路径不存在、不可读或未读完时立即停止,报告准确路径,**不得先写正文再补读**。写前必读按当前任务、当前会话重新执行;旧会话的“读过”不能沿用。
+ 28 **本章技法**(每章至多一份;类别只在这里定义,写手模板的读取表与它同步):按细纲主功能选。
+ 29 
+ 30 | 类别(读者情绪) | 文件 |
+ 31 |---|---|
+ 32 | 打脸/逆袭(爽感释放) | `style-combat-face.md` |
+ 33 | 身份/认知/立场反转(震撼+痛快) | `long-reversal.md` |
+ 34 | 感情拉扯(意难平) | `emotional-methods.md` |
+ 35 | 悬疑/惊悚/异常线索(紧张+好奇) | `long-suspense.md` |
+ 36 | 日常装逼(期待感) | `style-combat-face.md`「爽点公式与日常装逼」 |
+ 37 
+ 38 都不对应就不读。交给写手只在 prompt「本章技法」填类别;自己写只读该文件「什么时候读这份」和它指向的那一节,日更一批只读一份,按最需要的那章选。作者只说情绪时按括号反查题材。
+ 39 
+ 40 **记下本轮约束**:正文写前,读完上面的文件后重读当前请求、本章细纲和卷纲,原样记下用户明确的字数范围、必发生、禁止发生、精确时间锚与本章停笔点、章尾新债。参考文件只提供技法,不覆盖这些事实;作者给的字数范围写在细纲「字数范围」行(命令参数只作临时覆盖),有它就不用默认长度带(见 tracking-transaction.md)。交付前逐项复核:字数出了范围按 workflow-chapter「检测收口」交作者处置,不自动补字;其余项越界不算完成。
- 26 > 专业 agent 只查当前宿主:Claude `.claude/agents`、OpenCode `.opencode/agents`、Codex `.codex/agents` TOML、Antigravity `.agents/agents`(`invoke_subagent` + 同名 `TypeName`);ZCode 查已启用插件注册的同名角色,用 `Agent` 工具按实际 schema 派发,不要求 `.zcode/agents`。仅角色或调用能力缺失、返回 unknown agent 时报告 fallback 并 solo/direct,不因宿主名或其他端目录存在而降级。
+ 44 > 专业 agent 只查当前宿主:Claude `.claude/agents`、OpenCode `.opencode/agents`、Codex `.codex/agents` TOML、Antigravity `.agents/agents`(`invoke_subagent` + 同名 `TypeName`);ZCode 查已启用插件注册的同名角色,用 `Agent` 工具按实际 schema 派发,不要求 `.zcode/agents`。返回 unknown agent 时按下面的降级处理,不因宿主名或其他端目录存在而降级。
- 28 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**;同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进技术备注行;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
- 29 
- 30 **文风裁决**:正文写作、改写或审稿前先读 [references/style-resolution.md](references/style-resolution.md),加载本书文风并形成 `style_resolution`;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
- 31 
- 32 ## 作者记忆管理
- 33 
- 34 管理习惯读 `references/author-memory.md`(整理、超编、迁移按其中指路)。仅管理习惯时完成即停,不建书、不写正文。
+ 46 > 版本:项目根 `.story-deployed` 的 `agents_version` 与本版 `agents_version: 40` 不一致(缺失、非整数、更小或更大)时照常按当前宿主角色来源检查并 spawn,只对作者说一句「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」;大于 40 时额外提示先更新 oh-story-claudecode。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,对作者只说「这次我自己写」。
- 38 先明确每个场景的主导情绪,从对标中找有依据的剧情模式,把角色当功能位,用本书的角色和素材实现;写每章只读「不知道就会写错」的状态、伏笔与设定。契约与推进决策先过 `references/reader-contract-and-progression.md`「契约四问」。作者记忆:写正文时组装脚本已代查注入;其他任务直接跑 `{PYTHON} {skill 根}/scripts/author_memory_commit.py query --workspace {放 .active-book 的那层} --book-root {书目录} --kind …`(规划查 story_design、workflow、interaction,改稿查 prose_style,整章重写另加 story_design;无记忆返回空),执行者只拿输出的 `lines`,当前请求与本书文风优先。
- 39 
- 40 **本章技法(每章至多读一份)**:按细纲主功能选——打脸/逆袭(爽感释放)`style-combat-face.md`;身份/认知/立场反转(震撼+痛快)`long-reversal.md`;感情拉扯(意难平)`emotional-methods.md`,自己写时加 `emotion-on-page.md`;悬疑/惊悚/异常线索(紧张+好奇)`long-suspense.md`;日常装逼(期待感)`long-chapter-hooks.md`。都不对应就不读,按 writing-craft 写。第 1-3 章另读 `opening-design.md`「开篇落笔」。交给写手时只在 prompt「本章技法」填类别,由写手整份读;主会话自己写正文时只读该文件的「决策路由」和它指向的那一节(先看标题定位,不整读),日更一批只读一份,按本批最需要的那章选,其余章按 writing-craft 写。作者先说情绪没说题材时按括号反查,再从 `long-genre-catalog.md` 找细分方向。
+ 50 先明确每个场景的主导情绪,从对标中找有依据的剧情模式,把角色当功能位,用本书素材实现;写每章只读「不知道就会写错」的状态、伏笔与设定。推进决策先过四个排纲问题。作者记忆:写正文时组装脚本已代查;其他任务按 author-memory.md「查询」查,当前请求与本书文风优先。
- 46 先确定操作对象、交付范围和停点,再看项目状态;空项目不等于授权完整开书。范围与转正文规则如下。
+ 56 先确定操作对象、交付范围和停点,再看项目状态;空项目不等于授权完整开书。
- 53 | **开书** | "帮我开书",未限定规划层级 | 按确认点逐个走:定方向→定设定→卷纲→首批 10 章细纲,每个确认点作者说继续才往下;**最远停在细纲交付,不自动写正文** |
- 54 | **定设定** | "定设定",或已有题材定位、还没有角色与关系 | 定设定时刻:`references/workflow-setup.md` Phase 2,交付设定后停 |
+ 63 | **开书** | "帮我开书",未限定规划层级 | 按确认点逐个走:定方向→定设定→卷纲→前 10 章细纲,每个确认点作者说继续才往下;**最远停在细纲交付,不自动写正文** |
+ 64 | **定设定** | "定设定",或已有题材定位、还没有角色与关系 | Phase 2,交付设定后停 |
- 56 | **日更续写** | 关键词("日更"/"续写"/"继续写")**且**项目已有正文+追踪 | 加载 `references/workflow-daily.md` |
- 57 | **大修** | "修改第X章" / "回炉" / "重写第X章",对象是已写正文 | 加载 `references/workflow-revision.md`;只改细纲不进此流程 |
+ 66 | **日更续写** | 关键词("日更"/"续写"/"继续写")**且**项目已有正文+追踪 | 按 workflow-daily 控制批次 |
+ 67 | **大修** | "修改第X章" / "回炉" / "重写第X章",对象是已写正文 | 按 workflow-revision;只改细纲不进此流程 |
- 63 **转入正文**:明确的正文请求只授权进入写作流程。落正文前重新完成本轮「写前必读」,按 workflow-chapter 处理缺 state、使 `tracking_commit.py check` 通过,任一未完成就停止;之后按原流程写作、质检、提交,不再问是否继续。
+ 73 **转入正文**:明确的正文请求只授权进入写作流程。落正文前重新完成本轮「写前必读」,按 workflow-chapter 开头修好缺文件,没修好就停;之后按原流程写作、质检、提交,不再问是否继续。
- 75 无法判断场景时,给 2-4 个白话选项(如「只聊结构」「写大纲」「写第N章正文」)让用户选,不贴场景表,也不开放式提问。
+ 85 无法判断场景时,给 2-4 个白话选项让用户选,不贴场景表,也不开放式提问。
- 79 所有给作者看的汇报、提问和停下说明只讲三件事:写了/改了什么(章名、发生了什么);要作者定的事(一句白话问题+白话选项+推荐默认);下一步。不写脚本、字段、参数名、状态码和内部清单名(如 排纲自查、供给自查、S1-S4、字数带);编号必带故事标签,如「伏笔 F057(那封信的去处)」。检查结果一句白话带过,如「自查过设定和前文,没发现冲突」。回执、Notice、Fallback 等机器行只放最末一行「技术备注:」,其前可有一句下一步建议(如新开对话)。汇报照各 workflow 的模板写,不带代码块围栏;子 agent 返回的术语由主会话翻译后再说。
+ 89 所有给作者看的汇报、提问和停下说明只讲故事:写了/改了什么(章名、发生了什么);要作者定的事(一句白话问题+白话选项+推荐默认);下一步。不写脚本、字段、参数名、状态码、版本号和内部清单名(如 排纲自查、写纲前查缺、字数带);编号必带故事标签,如「伏笔 F057(那封信的去处)」。检查结果一句白话带过,如「自查过设定和前文,没发现冲突」。不加技术备注行:版本提示、没请写作助手这类事各用一句白话说。汇报照各 workflow 的模板写,不带代码块围栏;子 agent 返回的术语由主会话翻译后再说。
- 85 > **对标书路径查找**:优先 `{项目}/对标/{书名}/`,不存在则回退 `拆文库/{书名}/`(`拆文库/` 是拆文原始产出,`对标/` 是本项目引用视图,首次引用的复制规则见 workflow-setup.md「对标发现」第 3 条)。
+ 95 > **对标资料**:路径查找、无对标的判定、缺资料怎么办,都只在 benchmark-recall.md 定义。
- 87 > **卷纲不整读**:一律走 `{PYTHON} {skill 根}/scripts/outline_view.py --unit {单元ID} {卷纲路径}`(只要契约用 `--contract`,看目录用 `--toc`);找不到单元就核对单元ID或先补卷纲,不改用整读。排纲底稿放 `大纲/排纲底稿_{单元ID}.md`,只在排纲/补纲时读;取段器的作用域、历史与校验选项见 artifact-protocols.md 卷纲模板。
+ 97 > **卷纲不整读**:一律走 `{PYTHON} {skill 根}/scripts/outline_view.py --chapter {章号} {卷纲路径}`(知道编号也可用 `--unit {编号}`;只要卷级部分用 `--contract`,看目录用 `--toc`);找不到就核对章节范围或先补卷纲,不改用整读。
- 89 > **新增物三级**(排纲、写正文、处置共用;只看下一章需不需要知道它存在过):
+ 99 > **新增物三级**(缺东西时三种处理;排纲、写正文、处置共用;只看下一章需不需要知道它存在过):
- 91 > - **写了要报**:具名配角、势力、复用地点属性、能力形态、规矩、刻度、新伏笔、新关系或承诺、给主角留下的东西;照写并逐条进申报表(类型/名目/落在哪/后续义务;无写 `0`;末行「本章没写成的」),主会话核对后才算续写事实。
- 92 > - **先问作者**:新主线事件或反转、金手指规则与力量档位、真相或伏笔结算、经济锚点、读者契约、提前写后续章、改变细纲已定结果或人物决定、卷纲新增编号、碰主推线或终局底牌、与既有裁定或承诺冲突;写正文时不写,排纲时挂起列候选,由主会话问作者。
- 93 > 拿不准:写时按写了要报,处置时按先问作者。
+ 101 > - **补上并记下**:具名配角、势力、复用地点属性、能力形态、规矩、刻度、新伏笔、新关系或承诺、给主角留下的东西;照写并逐条进申报表(类型/名目/落在哪/后续义务;无写 `0`;末行「本章没写成的」),主会话核对后才算续写事实。正文里新长出的伏笔由主会话登记时取本卷伏笔表的下一个编号、追加进伏笔表(只增不改,不算改卷纲)。
+ 102 > - **先问作者**:新主线事件或反转、金手指规则与力量档位、真相或伏笔结算、经济锚点、读者期待、提前写后续章、改变细纲已定结果或人物决定、卷纲新增主线或故事线、碰这卷主打的线或后面才揭开的东西、与既有规矩或承诺冲突;写正文时不写,排纲时挂起列候选,由主会话问作者。
+ 103 > 拿不准:写时按补上并记下,处置时按先问作者。
- 99 按作者确认点分时刻读(见首屏写前必读第 1 条);每个时刻文件开头写了本时刻的交接规则,出卷纲、出细纲时不必再读 workflow-setup.md。
+ 109 按作者确认点分时刻走,每个时刻文件开头写了交接规则。
- 105 #### 项目文件与产物
- 106 
- 107 要找某类产物放哪、或修复缺失文件时,完整读取 [references/project-files.md](references/project-files.md) 照做;开书建文件按各时刻文件写明的路径直接落盘,写正文时缺文件按 workflow-chapter 开头停下修,都不必先读它。
- 108 
- 109 #### 单章写作流程
- 110 
- 111 **执行前先读 [references/workflow-chapter.md](references/workflow-chapter.md)**,按其步骤 1-13 执行。日更批量另加载 `references/workflow-daily.md`。
+ 115 每章按 workflow-chapter「单章写作流程」逐步执行。
- 115 所有追踪写入都走 `scripts/tracking_commit.py`:`追踪/_tracking-state.json` 是唯一权威,`上下文.md`、角色快照、`伏笔.md`、时间线都由它派生,禁止手改。体积上限由脚本检查、超限一次报全;字段与上限见 [tracking-transaction.md](references/tracking-transaction.md),出错时才读。
+ 119 所有追踪写入都走 `scripts/tracking_commit.py`:`追踪/_tracking-state.json` 是唯一底账,`上下文.md`、角色快照、`伏笔.md`、时间线都由它自动生成,禁止手改。体积上限由脚本检查;字段与上限见 [tracking-transaction.md](references/tracking-transaction.md)。
- 130 
- 131 ---
- 132 
- 133 ## 参考资料索引
- 134 
- 135 阶段必读项按首屏「写前必读」执行;写正文不按索引加读;规划或作者点名问技法时按 [参考索引](references/reference-index.md) 的加载条件选用。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-publish/SKILL.md

Week of Nov 2, 2026 · +14 / −11 lines

Before Local scripts → After Local scripts

cc6397f2b071 → 7383fd6cd8ac

- 3 description: "小说发布准备:为发布平台整理并核对书名、简介、主角名、分类和标签,定稿后保存发布资料。触发方式:/story-publish、/发布资料、「填写平台建书资料」「建书表单」「起书名/写简介/选标签用于发布」;正文累计约 2 万字、准备上架时也适用。当前仅适配番茄(长篇与短故事),不代替后台填表或实际发布。"
+ 3 description: "小说发布准备:调用即生成并保存发布资料,缺失字段留空;按平台整理书名、笔名、分类、标签及所需简介。触发方式:/story-publish、/发布资料、「填写平台建书资料」「建书表单」「起书名/写简介/选标签用于发布」;正文累计约 2 万字、准备上架时也适用。当前适配番茄长篇与短故事(短故事无需简介),不代替后台填表或实际发布。"
+ 13 - **每次调用必须交付资料。** 不得只提问、列计划或因缺项结束本轮。先保存可逐步完善的资料,再补问;所有未获取或未确认的填写值留空。平台未适配、书目录不明、封面未就绪都不豁免生成。回复前确认文件存在且可读并给出路径;写入失败或无写入能力时,在回复中完整输出资料并说明未落盘。
- 15 - **平台候选只取自本 skill 的平台参考文件。** 不凭记忆,不从扫榜、拆文、选题材料里挪用,平台之间不共享。没有故事事实时先问,不编人物、情节或卖点。
+ 16 - **平台候选只取自本 skill 的平台参考文件。** 不凭记忆,不从扫榜、拆文、选题材料里挪用,平台之间不共享。没有故事事实时先留空、保存后补问,不编人物、情节或卖点。
- 20 书目录:作者指定的优先,其次 `.active-book`;指向不明或多本书分不清时问作者,不从目录名猜。只读,不改设定、不启动写作阶段。
+ 21 书目录:作者指定的优先,其次 `.active-book`;指向不明或多本书分不清时先在当前工作目录保存草案,并列出待确认的书目录,不猜作品、不读取不明作品。只读,不改设定、不启动写作阶段。
- 24 - `选题决策.md`、拆文、扫榜材料只能支撑建议;暂定书名、角色卡姓名不自动成为定稿。设定里没写书名时,以书目录名为现用书名。
+ 25 - `选题决策.md`、拆文、扫榜材料只能支撑建议;暂定书名、角色卡姓名和目录名不自动成为定稿。未获取已确认书名时留空。
- 30 其他平台:明确说“当前未适配”,请作者提供带日期的建书表单截图或官方说明;拿到前只给不针对平台的书名、简介草案,不套用番茄规则。新增平台时照 `fanqie.md` 的结构写参考文件,注明核验日期和范围。
+ 31 其他平台:明确说“当前未适配”,先保存平台无关的资料草案,未知字段留空;再请作者提供带日期的建书表单截图或官方说明,不套番茄规则。新增平台时照 `fanqie.md` 的结构写参考文件,注明核验日期和范围。
- 34 1. 确认目标平台和作品类型(长篇/短故事),在回复开头写明平台、适配状态,以及平台参考里的核验日期与范围。
+ 35 1. 调用即先生成并保存资料骨架,再逐步补齐。用已知目标平台、作品类型和平台参考的核验日期与范围;平台或类型未知就留空、列待办,不猜,也不等待补问回复才输出。先读已有同名文件,按下文保护作者修改。
- 37 4. 书名和简介确认后,按「封面」一节处理。
- 38 5. 本轮要的字段都有了结论(已确认,或作者决定不填)时保存文件;还没保存时,在回复里给出完整草案。保存后的回复只说这次写进了什么、还差什么,并给出文件路径,不重贴全文。
+ 38 4. 已有书名、笔名及题材依据时按「封面」处理,不以简介确认作为前置条件。番茄短故事无需平台简介,用设定中的梗概、题材招式和目标情绪支持封面。
+ 39 5. 本轮已知信息写入资料,未获取或未确认的字段留空,并在「待作者确认」列出;不要为填满文件编造书名、笔名或其他值。封面选择或补问不阻塞保存。回复说明文件路径、已填写和缺失项;只有所有需求均有结论时才说“发布资料准备完成”。无文件写入能力时在回复中完整输出草案,并明确未落盘。
- 45 把已确认的书名、简介、笔名、平台、题材和角色/场景事实交给 `story-cover`,缺笔名时补问:直接生成走它的完整流程,仅提示词走它的 Step 1-3。两种都把完整提示词原文写进「封面」小节,生图成功另记图片路径。`story-cover` 不可用(如 OpenClaw 缺 Key 时发现不到)、失败或作者暂缓时,把原因写进「待作者确认」,不阻塞其他字段;生图失败后改仅提示词要作者同意。只有提示词或未保存的图片,不说“封面已备妥”。`story-cover` 的风格、尺寸建议不替代平台规格。
+ 46 把已确认的书名、笔名、平台及作品中的题材依据交给 `story-cover`:长篇用题材类型、核心梗;短篇用梗概、题材招式、目标情绪。已有简介可作补充参考,与平台是否填写简介无关,不为封面另拟或强求简介。缺书名或笔名时先保存资料,将封面字段留空并列待办;仅提示词模式缺题材依据时也先留待确认。直接生成走完整流程,仅提示词走 Step 1-3。完整提示词写进「封面」,成功另记图片路径。入口不可用、失败或暂缓时写明原因,不阻塞保存;生图失败后改仅提示词须作者同意。仅有提示词不称“封面已备妥”,风格尺寸建议不替代平台规格。
- 49 文件名是 `发布资料-<目标平台>.md`,目标平台用平台参考元信息里的 `platform` 原文(如 `发布资料-番茄小说.md`)。放在书目录:长篇是 `正文/` 的上一级,短篇是 `正文.md` 所在目录;还没有正文时直接放书目录下。已有同名文件时先读,和作者手改的内容冲突就先问,不覆盖;旧文件按下面的格式重排,保留作者手写内容。
+ 50 文件名是 `发布资料-<目标平台>.md`,目标平台用平台参考元信息里的 `platform` 原文(如 `发布资料-番茄小说.md`)。放在书目录:长篇是 `正文/` 的上一级,短篇是 `正文.md` 所在目录;还没有正文时直接放书目录下。已有同名文件先读;有手改冲突先另存本轮草案,再请作者确认,不覆盖原文件。无冲突时直接补齐或保留已有资料,不为每次调用重复建文件。
+ 51 
+ 52 平台未知先用 `发布资料-待确认平台.md`;书目录未知先存当前工作目录,位置列待确认。未知平台或类型不套平台字段,不宣称通过平台校验;确认后再迁移和补齐,目标文件已存在先核对。已有文件有冲突时保留原文件,本轮草案另存不重名文件并告知路径。
- 54 - 元信息后紧接 `# 书本名称:<书名>`,然后是基础字段、`## 封面`、平台的标签或分类小节、`## 作品简介`、`## 待作者确认`、`## 待平台核实`、`## 来源说明`。基础字段和标签小节以平台参考元信息里该作品类型的 `basics`、`tag_sections` 为准,每个字段一行 `- 字段:值`,同一字段多个值用顿号分隔。
+ 57 - 元信息后紧接 `# 书本名称:<书名>`,然后是基础字段、`## 封面`、平台标签或分类、所需简介、`## 待作者确认`、`## 待平台核实`、`## 来源说明`。平台规则 `synopsis: false` 时不输出「作品简介」(番茄短故事);其余保留。基础字段和标签以 `basics`、`tag_sections` 为准,每个字段独立一行 `- 字段:值`,多值用顿号分隔。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-review/SKILL.md

Week of Nov 2, 2026 · +1 / −1 lines

Before Local scripts → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 9 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**;同时在「这次怎么审的」里用一句白话提示作者「审稿助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进技术备注行;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。版本提示本身不触发降级;文件缺失或异常、工具不可用、递归限制或调用失败按 Phase 0 处理,技术备注写 `Fallback: ... -> solo`。
+ 9 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 40` 不一致时(标记缺失、字段缺失/非整数、小于或大于 40)**照常按当前宿主角色来源检查并 spawn**;同时在「这次怎么审的」里用一句白话提示作者「审稿助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 40)` 原文写进技术备注行;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。版本提示本身不触发降级;文件缺失或异常、工具不可用、递归限制或调用失败按 Phase 0 处理,技术备注写 `Fallback: ... -> solo`。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-setup/SKILL.md

Week of Nov 2, 2026 · +6 / −6 lines

Before Network or broad shell → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 3 version: 1.3.6
+ 3 version: 1.3.8
- 29    - `agents_version` 缺失、非整数或小于 `38` → 标记为待更新,继续执行当前部署
- 30    - `agents_version: 38` → 使用 AskUserQuestion 确认是否重新部署;提示里写明重新部署只用**当前本地 skill 包**刷新项目文件,要拿 skill 本身的新版本得先更新 oh-story-claudecode(`npx skills add` 或 marketplace),再回来重跑
- 31    - `agents_version` 大于 `38` → 当前 story-setup 比项目部署旧;停止以避免降级覆盖,提示先更新 oh-story-claudecode,不写任何部署文件
+ 29    - `agents_version` 缺失、非整数或小于 `40` → 标记为待更新,继续执行当前部署
+ 30    - `agents_version: 40` → 使用 AskUserQuestion 确认是否重新部署;提示里写明重新部署只用**当前本地 skill 包**刷新项目文件,要拿 skill 本身的新版本得先更新 oh-story-claudecode(`npx skills add` 或 marketplace),再回来重跑
+ 31    - `agents_version` 大于 `40` → 当前 story-setup 比项目部署旧;停止以避免降级覆盖,提示先更新 oh-story-claudecode,不写任何部署文件
- 92   agents_version: 38
- 93   setup_skill_version: 1.3.6
+ 92   agents_version: 40
+ 93   setup_skill_version: 1.3.8

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-short-analyze/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Instructions only → After Instructions only

cc6397f2b071 → 7383fd6cd8ac

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-short-scan/SKILL.md

Week of Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

skills/story-short-write/SKILL.md

Week of Nov 2, 2026 · +25 / −31 lines

Before Local scripts → After Network or broad shell

cc6397f2b071 → 7383fd6cd8ac

- 15 短篇按作者当前要做的事分阶段加载,阶段之间靠落盘文件交接。创建或修改故事文件前,先判断当前时刻,再完整读取该时刻的必读项;分块读取直到 EOF,`rg` 检索或局部摘读不算读完。**只读本 SKILL.md 不算完成门禁。**
+ 15 短篇按作者当前要做的事分时刻读文件,时刻之间靠落盘文件交接。创建或修改故事文件前,先判断当前时刻,按下表读完(这张表是唯一的读取清单);只读本文件、`rg` 检索或摘读都不算。**按节读只允许两种**:本表点名的节,或文件内「什么时候读这份」点名的节;其余整份读到结尾。缺文件、没读完或题材还没对上唯一的题材包就停,报准确路径或待定项,**不得创建或修改故事产物**。每个时刻、每个会话重新读。
- 17 | 时刻 | 作者确认什么 | 读什么 | 落盘 |
- 18 |---|---|---|---|
- 19 | 定情绪(Phase 1) | 读者读完的感觉、题材方向 | 本文件 | 进构思时写入 `设定.md` |
- 20 | 构思(Phase 2) | 故事核、人物、反转、付费点 | ① `references/workflow-design.md`、`references/submission-craft.md`、`references/short-craft.md`、`references/short-reversal.md` ② 核心 10 题材读一个精确的 `references/genre-styles/{题材}.md`,冷门题材读 `references/genre-writing-formulas.md` ③ 有反派或真相揭露设计时读 `references/villain-and-reveal.md`,不适用时在设计校验区写明原因 | `设定.md`、`小节大纲.md` |
- 21 | 写正文(Phase 3–4) | 成稿 | Phase 3 写正文前完整读取 `references/workflow-draft.md`,按其「写前加载」读写作手法;Phase 4 精修前完整读取 `references/workflow-revision.md` | `正文.md` |
+ 17 | 时刻 | 作者确认什么 | 必读 | 条件满足才读 | 落盘 |
+ 18 |---|---|---|---|---|
+ 19 | 定情绪(Phase 1) | 读者读完的感觉、题材方向 | 本文件 | — | 进构思时写入 `设定.md` |
+ 20 | 构思(Phase 2) | 故事核、人物、反转、付费点 | `workflow-design.md`、`submission-craft.md`、`short-craft.md`、`short-reversal.md`、`emotional-methods.md`「情感拉扯节奏设计」;核心 10 题材读一个 `genre-styles/{题材}.md`,冷门读 `genre-writing-formulas.md` | 有反派或真相揭露:`villain-and-reveal.md`;有对标或参考小说:`benchmark-recall.md`;付费点断点拿不准:`hooks-chapter.md`「2. 节尾」 | `设定.md`、`小节大纲.md` |
+ 21 | 写正文(Phase 3) | 成稿 | `workflow-draft.md`、`short-format.md`、`short-craft.md`、`scene-craft.md`、设定.md 写的那个题材包(冷门不读) | 写羁绊或余韵:`emotional-methods.md`「情感虐心三板斧」;对白驱动的博弈、审判、打脸:`dialogue-mastery.md`「什么时候读这份」和它点名的一节;交给写手:`agent-calls.md` | `正文.md` |
+ 22 | 精修(Phase 4) | 交付 | `workflow-revision.md`、`short-format.md` | 主会话自己去味:`short-deslop.md`,拿不准某条信号时查 `banned-words.md` 对应一节;去味交给写手:`agent-calls.md` | `正文.md` |
+ 23 | 管理作者习惯 | 记、改、忘 | `author-memory.md`;完成即停,不建书、不写正文 | — | — |
- 23 构思必读项须在首次写入 `设定.md` / `小节大纲.md` 前读完。任一必需路径不存在、不可读,或题材尚未对应到唯一 reference 时,立即停止,报告准确路径或待定项,**不得创建或修改故事产物**。故事文件只记录选出的题材招式、反转计算等设计,不写“已读 references”的回执。进入每个时刻都按当前任务完整回读。
+ 25 故事文件只记录选出的套路、反转位置等设计,不写“已读 references”的回执。
- 25 **交接只靠落盘**:作者在对话里定下的字数、平台、人称、偏好、红线和否掉的方案,构思交付前写进 `设定.md`;写正文只读两份设计文件与本时刻的写作手法,不重读构思方法论,也不回翻对话。
- 26 **换上下文**:构思阶段加载最多,汇报末尾建议作者新开对话说「写正文」;作者选择在本对话接着写时照常执行。新对话中,两份设计文件通过构思完成门禁即可进入写正文。
+ 27 **交接只靠落盘**:作者在对话里定下的字数、平台、人称、偏好、红线和否掉的方案,构思交付前写进 `设定.md`;写正文只读两份设计文件与本时刻的写作手法,不重读构思方法,也不回翻对话。
+ 28 **换上下文**:构思时刻读得最多,汇报末尾建议作者新开对话说「写正文」;作者选择在本对话接着写时照常执行。新对话中,两份设计文件通过构思完成门禁即可进入写正文。
- 30 > Agent 只查当前宿主:Claude `.claude/agents`(`subagent_type`)、OpenCode `.opencode/agents`(`subagent` 的 `agent`)、Codex `.codex/agents` TOML(`agent_type`)、Antigravity `.agents/agents`(`invoke_subagent` + `TypeName`);ZCode 查插件注册的同名角色,用 `Agent` 按实际 schema 派发,不要求 `.zcode/agents`。主会话自己写正文、去味是常态,不报;作者明确要交给写作助手而角色/工具缺失或 unknown agent 时,由主会话接手并一句白话告诉作者,`Fallback: project custom agents unavailable -> solo` 原文只进汇报最后一行「技术备注:」。
+ 32 > 专业 agent 只查当前宿主:Claude `.claude/agents`(`subagent_type`)、OpenCode `.opencode/agents`(`subagent` 的 `agent`)、Codex `.codex/agents` TOML(`agent_type`)、Antigravity `.agents/agents`(`invoke_subagent` + `TypeName`);ZCode 查插件注册的同名角色,用 `Agent` 按实际 schema 派发,不要求 `.zcode/agents`。主会话自己写正文、去味是常态,不报;作者明确要交给写作助手而角色/工具缺失或返回 unknown agent 时,由主会话接手,对作者只说「这次我自己写」。
- 32 > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 38` 不一致时(标记缺失、字段缺失/非整数、小于或大于 38)**照常按当前宿主角色来源检查并 spawn**,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」,`Notice: agents bundle 版本不匹配(项目 {N},本版 38)` 原文写进技术备注行;大于 38 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,`Fallback: ... -> solo` 同样只进技术备注行。
- 33 
- 34 **文风裁决**:正文写作、改写或审稿前先读 [references/style-resolution.md](references/style-resolution.md),加载本书文风并形成 `style_resolution`;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
+ 34 > 版本:项目根 `.story-deployed` 的 `agents_version` 与本版 `agents_version: 40` 不一致(缺失、非整数、更小或更大)时照常按当前宿主角色来源检查并 spawn,只对作者说一句「写作助手是旧版,运行 /story-setup(ZCode 先更新插件)后新开会话」;大于 40 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有当前宿主角色缺失或不暴露调用能力时才降级 solo/direct,对作者只说「这次我自己写」。
- 41 4. **开头 3 句定生死,结尾定传播**。开头必须包含钩子,结尾必须有余韵。
+ 41 4. **开头抓人,结尾留余韵**。开头写法以 short-craft「开头事件密度」为准,题材包「开篇范式」覆盖它。
- 48 管理习惯读 `references/author-memory.md`(整理、超编、迁移按其中指路)。仅管理习惯时完成即停,不建书、不写正文。
+ 48 管理习惯按上表读 `references/author-memory.md`(整理、超编、迁移按其中指路)。
- 52 - **按题材选写法**:确定题材后,按文风裁决选用题材包的腔调、开篇、钩子、情绪烈度、金句、招式与收尾;追妻按时代变体及小三/死人文学分支选择。冷门题材用公式安排结构,腔调按 `short-craft.md`
+ 52 - **按题材选写法**:确定题材后选用[题材包](references/genre-styles/)的腔调、开篇、钩子、情绪烈度、金句、套路与收尾;追妻按时代变体及小三/死人文学分支选择。冷门题材用公式安排结构,腔调按 `short-craft.md`。写法冲突时的先后见 short-craft 开头。
- 69 | 情绪类型 | 适合场景 | 难度 | 常配题材包 |
+ 69 | 情绪类型 | 适合场景 | 难度 | 常见题材 |
- 84 存在本篇 `对标/`、项目根 `拆文库/` 或用户提供参考小说时,先完整读取 [references/benchmark-recall.md](references/benchmark-recall.md),执行对标发现、排除本书续写基线、题材匹配与召回。无外部对标时仍按原题材包执行。
+ 84 存在本篇 `对标/`、项目根 `拆文库/` 或用户提供参考小说时,先完整读取 [references/benchmark-recall.md](references/benchmark-recall.md),执行对标发现、排除本书已写部分、题材匹配与召回。无外部对标时仍按原题材包执行。
- 94 进入正文写作前,完整读取 [references/workflow-draft.md](references/workflow-draft.md),执行交付参数锁定、写前验收与逐场景写作;只做构思或精修时不加载。
+ 94 进入正文写作前,完整读取 [references/workflow-draft.md](references/workflow-draft.md),执行交付参数锁定、写前验收与逐场景写作;只做构思或精修时不加载。下面两段是写正文和精修共用的完成标准,只在这里写。
- 97 1. **写作时**:每节围绕一个主问题推进;让风险、信息、关系、资源、决定、行动或读者理解至少发生一项可见变化。相关情节点可以由同一动作链或对话同时兑现,不为拆成多个“子事件”重复铺陈。
- 98 2. **写完后**:对照 `小节大纲.md` 检查批准内容是否落地、因果与下一步是否读得懂、感知/反应是否提供新信息、伏笔/物件是否按计划出现。
+ 97 1. **写作时**:每节围绕一个主问题推进;让风险、信息、关系、资源、决定、行动或读者理解至少发生一项具体变化。相关情节点可以由同一动作链或对话同时兑现,不为拆成多个“子事件”重复铺陈。
+ 98 2. **写完后**:对照 `小节大纲.md` 检查批准内容是否落地、因果与下一步是否读得懂、感知/反应是否提供新信息、埋下的东西后面有没有接上。
- 104 - [ ] 总字数进入锁定的用户范围;作者没给时进入 `设定.md` 的目标字数(构思时按所选平台的投稿区间定,未定平台用 8000-12000,见 submission-craft.md)
+ 104 - [ ] 总字数(交付检查报的非空白字数)进入锁定的用户范围;作者没给时进入 `设定.md` 的目标字数
- 106 - [ ] 节数 = 小节大纲规划节数(不得合并/省略)
+ 106 - [ ] 节数 = 小节大纲规划节数(不得合并/省略;某节确实不需要独立存在,回构思改大纲,不在写正文时偷减)
- 109 - [ ] `node scripts/check-ai-patterns.js --check --fail-on=blocking 正文.md` 无 blocking 命中;其余提示先通读,确属问题再改
- 110 - [ ] `node scripts/check-degeneration.js --check 正文.md` 无 blocking 退化命中(复读/截断/工程词泄漏)
+ 109 - [ ] `node {skill 根}/scripts/check-ai-patterns.js --check --fail-on=blocking {短篇目录}/正文.md` 无 blocking 命中;其余提示先通读,确属问题再改
+ 110 - [ ] `node {skill 根}/scripts/check-degeneration.js --check {短篇目录}/正文.md` 无 blocking 退化命中(复读/截断/工程词泄漏)
- 128 
- 129 ---
- 130 
- 131 ## 参考资料
- 132 
- 133 阶段必读项按首屏「写前必读」执行;其他资料按 [参考索引](references/reference-index.md) 的加载条件选用。

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → cc6397f2b071

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 7383fd6cd8acee8cf9f7805b058d1f342874a7c2

git clone --filter=blob:none --no-checkout https://github.com/zenstory-ai/oh-story-claudecode.git .hotskills/zenstory-ai-oh-story-claudecode && git -C .hotskills/zenstory-ai-oh-story-claudecode checkout --detach 7383fd6cd8acee8cf9f7805b058d1f342874a7c2 # Copy each selected skill directory from .hotskills/zenstory-ai-oh-story-claudecode into .claude/skills/<skill-name>/
git clone --filter=blob:none --no-checkout https://github.com/zenstory-ai/oh-story-claudecode.git .hotskills/zenstory-ai-oh-story-claudecode && git -C .hotskills/zenstory-ai-oh-story-claudecode checkout --detach 7383fd6cd8acee8cf9f7805b058d1f342874a7c2 # Copy each selected skill directory from .hotskills/zenstory-ai-oh-story-claudecode into .agents/skills/<skill-name>/
8.4kGitHub stars
180stars in 7 days
14skills in this repository
70commits in 30 days

Heat

7.8
  • Star growth, last 7 daysAhead of 92% of tracked repositories
  • Star growth, last 24 hoursAhead of 92% of tracked repositories
  • Rank movement, last 7 daysAhead of 78% of tracked repositories
  • Commits, last 30 daysAhead of 92% of tracked repositories
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekAhead of 0% of tracked repositories

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Aug 2, 2026Nov 7, 20268,375

Individual skills in this repository

How it works

browser-cdp

When your agent uses it

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.

What it loads into context

Frontmatter

132 tokens

Always available to the agent

SKILL.md

2,372 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 前置条件
  2. 启动流程(每次都按这个顺序)
  3. 启动脚本选项
  4. 常用操作
  5. 停止 / 清理
  6. 长命令加超时
  7. 常见问题

Scripts executed separately

  • scripts/setup-cdp-chrome.js

Files

  • ../../.claude-plugin/marketplace.jsonasset554 bytes
  • ../../.claude-plugin/plugin.jsonasset245 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • SKILL.mdcore8,083 bytes
  • scripts/setup-cdp-chrome.jsruns40,851 bytes
Read SKILL.md
# Browser CDP 操作工具

通过 CDP(Chrome DevTools Protocol)连接 Chrome,复用登录态并执行浏览器操作。

## 前置条件

- macOS / Linux / Windows(实验性),已安装并使用过 Google Chrome,来源 profile 已存在
- Node.js 20+
- `agent-browser` 已安装:`npm install -g agent-browser`

> 启动或重建时,若需结束 Chrome 进程,先按下方流程征得同意;未保存的标签页或草稿可能丢失。

---

## 启动流程(每次都按这个顺序)
View the complete source on GitHub

Skills included

  • browser-cdp
  • story
  • story-cover
  • story-deslop
  • story-import
  • story-long-analyze
  • story-long-scan
  • story-long-write
  • story-publish
  • story-review
  • story-setup
  • story-short-analyze
  • story-short-scan
  • story-short-write

Repository facts

License
MIT
Created
Apr 22, 2026
Last pushed
Nov 7, 2026
Forks
1,178
Open issues
3
Project activity
Active

Rank over the last 12 weeks

Now #175 · best #173 · up 1 in 30 days

  1. #175 from Oct 30 to Oct 31
  2. #174 on Nov 1
  3. #173 on Nov 2
  4. #174 on Nov 3
  5. #173 on Nov 4
  6. #175 since Nov 5
66 earlier periods
  1. #194 on Aug 2
  2. #191 on Aug 8
  3. #192 on Aug 9
  4. #194 on Aug 10
  5. #192 on Aug 11
  6. #190 on Aug 12
  7. #194 on Aug 13
  8. #193 on Aug 14
  9. #191 on Aug 15
  10. #190 from Aug 16 to Aug 17
  11. #192 on Aug 18
  12. #188 on Aug 19
  13. #182 on Aug 20
  14. #185 on Aug 21
  15. #181 on Aug 22
  16. #187 on Aug 23
  17. #185 on Aug 24
  18. #186 from Aug 25 to Aug 26
  19. #185 on Aug 27
  20. #182 on Aug 28
  21. #183 on Aug 29
  22. #181 from Aug 30 to Aug 31
  23. #186 on Sep 1
  24. #178 on Sep 2
  25. #184 on Sep 3
  26. #181 on Sep 4
  27. #182 on Sep 5
  28. #180 on Sep 6
  29. #181 on Sep 7
  30. #180 from Sep 8 to Sep 9
  31. #179 on Sep 10
  32. #178 on Sep 11
  33. #180 from Sep 12 to Sep 13
  34. #179 from Sep 14 to Sep 16
  35. #180 from Sep 17 to Sep 18
  36. #178 on Sep 19
  37. #182 on Sep 20
  38. #181 from Sep 21 to Sep 22
  39. #183 on Sep 23
  40. #181 on Sep 24
  41. #180 from Sep 25 to Sep 26
  42. #181 on Sep 27
  43. #182 from Sep 28 to Sep 29
  44. #178 on Sep 30
  45. #180 on Oct 1
  46. #181 on Oct 2
  47. #178 on Oct 3
  48. #175 on Oct 4
  49. #178 on Oct 5
  50. #175 on Oct 6
  51. #177 on Oct 7
  52. #176 on Oct 8
  53. #178 on Oct 9
  54. #177 on Oct 10
  55. #178 on Oct 11
  56. #176 from Oct 12 to Oct 13
  57. #175 on Oct 14
  58. #174 on Oct 15
  59. #173 on Oct 16
  60. #176 on Oct 17
  61. #177 on Oct 18
  62. #175 on Oct 19
  63. #174 from Oct 20 to Oct 22
  64. #173 from Oct 23 to Oct 24
  65. #174 on Oct 25
  66. #174 from Oct 28 to Oct 29

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 7, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 19 notes
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/browser-cdp/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-cover/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-deslop/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-deslop/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-deslop/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-review/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-setup/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-short-write/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • skills/story-short-write/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 369 signals by file

skills/browser-cdp/SKILL.md

  • Network accessline 2
    name: browser-cdp description: "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, evalu
  • Network accessline 3
    description: "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, 
  • Network accessline 4
    metadata: {"openclaw":{"requires":{"bins":["agent-browser"]},"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 33
    CDP_STATUS=ready                        # 已就绪,可直接复用 CDP_URL=http://127.0.0.1:9222/json/version
  • Network accessline 34
    CDP_URL=http://127.0.0.1:9222/json/version
  • Dangerous shell operationline 95
    agent-browser --cdp 9222 eval 'document.body.innerText.substring(0, 8000)'
  • Dangerous shell operationline 103
    agent-browser --cdp 9222 eval 'localStorage.getItem("token") || document.cookie'
  • Dangerous shell operationline 150
    $job = Start-Job { agent-browser --cdp 9222 eval "window.location.replace('https://www.qidian.com/rank/')" }
  • Network accessline 150
    $job = Start-Job { agent-browser --cdp 9222 eval "window.location.replace('https://www.qidian.com/rank/')" }
  • Dangerous shell operationline 160
    timeout 30 agent-browser --cdp 9222 eval "window.location.replace('https://www.qidian.com/rank/')" || echo "⏱ CDP 操作超时(30s),请重试或手动打断"
  • Network accessline 160
    timeout 30 agent-browser --cdp 9222 eval "window.location.replace('https://www.qidian.com/rank/')" || echo "⏱ CDP 操作超时(30s),请重试或手动打断"

skills/browser-cdp/scripts/setup-cdp-chrome.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 238
    async function probeCDP(port) {   try {     const version = await httpGet(`http://127.0.0.1:${port}/json/version`);
  • Network accessline 239
    try {     const version = await httpGet(`http://127.0.0.1:${port}/json/version`);     return version;
  • Network accessline 240
    const version = await httpGet(`http://127.0.0.1:${port}/json/version`);
  • Access to secretsline 627
    [Credential-related source omitted]
  • Access to secretsline 628
    [Credential-related source omitted]
  • Network accessline 679
    if (version) {     log("CDP_STATUS=ready");     log(`CDP_URL=http://127.0.0.1:${CDP_PORT}/json/version`);
  • Network accessline 681
    log(`CDP_URL=http://127.0.0.1:${CDP_PORT}/json/version`);
  • Network accessline 794
    step("启动 Chrome(含 --remote-allow-origins=*, --no-first-run 等)");     step(       `验证 http://127.0.0.1:${CDP_PORT}/json/version 来自本次启动的实例` +
  • Network accessline 795
    step(       `验证 http://127.0.0.1:${CDP_PORT}/json/version 来自本次启动的实例` +         "(身份取得到且已变 + 进程存活 + 端口的 LISTEN 持有者就在这棵进程树里)"
  • Network accessline 796
    `验证 http://127.0.0.1:${CDP_PORT}/json/version 来自本次启动的实例` +

skills/story-cover/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "小说封面生成与提示词设计。根据书名、作者名和题材构建封面提示词;用户只要提示词时不生图,要求封面图时调用 GPT-Image-2,Codex CLI 优先使用内置 ImageGen。触发方式:/story-cover、/封面、「帮我做个封面」「生成封面图」「封面提示词」「封面设计」。" metadata: {"openclaw":{"requires":{"env":["GPT_IMAGE_API_KEY"],"bin
  • Network accessline 4
    description: "小说封面生成与提示词设计。根据书名、作者名和题材构建封面提示词;用户只要提示词时不生图,要求封面图时调用 GPT-Image-2,Codex CLI 优先使用内置 ImageGen。触发方式:/story-cover、/封面、「帮我做个封面」「生成封面图」「封面提示词」「封面设计」。" metadata: {"openclaw":{"requires":{"env":["GPT_IMAGE_API_KEY"],"bins":["curl","jq"
  • Network accessline 5
    [Credential-related source omitted]
  • Access to secretsline 5
    [Credential-related source omitted]
  • Access to secretsline 17
    [Credential-related source omitted]
  • Access to secretsline 18
    [Credential-related source omitted]

skills/story-cover/references/api-fallback.md

  • Network accessline 8
    |:-----|:----:|:-----|:-----| | `GPT_IMAGE_API_KEY` | 是 | — | OpenAI 或兼容代理的 API Key | | `GPT_IMAGE_BASE_URL` | | `https://api.openai.com/v1` | 用兼容代理时改这个 |
  • Network accessline 9
    [Credential-related source omitted]
  • Access to secretsline 9
    [Credential-related source omitted]
  • Network accessline 10
    | `GPT_IMAGE_BASE_URL` | | `https://api.openai.com/v1` | 用兼容代理时改这个 |
  • Network accessline 21
    [Credential-related source omitted]
  • Access to secretsline 21
    [Credential-related source omitted]
  • Network accessline 22
    : "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}" BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}" MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
  • Network accessline 23
    BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
  • Dangerous shell operationline 35
    trap 'rm -f "$RESP"' EXIT
  • Network accessline 44
    [Credential-related source omitted]
  • Access to secretsline 44
    [Credential-related source omitted]
  • Access to secretsline 46
    [Credential-related source omitted]
  • Network accessline 74
    [Credential-related source omitted]
  • Access to secretsline 74
    [Credential-related source omitted]
  • Network accessline 75
    : "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}" BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}" MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
  • Network accessline 76
    BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
  • Dangerous shell operationline 90
    trap '[ -n "$REF_TMP" ] && rm -f "$REF_TMP"; rm -f "$RESP"' EXIT
  • Network accessline 92
    # URL 先下载到临时文件,本地路径直接用。用裸 mktemp 以保证 macOS/Linux 行为一致。 case "$REF_IMAGE" in   http://*|https://*)
  • Network accessline 93
    case "$REF_IMAGE" in   http://*|https://*)     REF_TMP=$(mktemp)
  • Network accessline 94
    http://*|https://*)     REF_TMP=$(mktemp)     curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"
  • Network accessline 95
    REF_TMP=$(mktemp)     curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"     REF_LOCAL="$REF_TMP"
  • Network accessline 96
    curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"
  • Network accessline 105
    [Credential-related source omitted]
  • Access to secretsline 105
    [Credential-related source omitted]
  • Access to secretsline 107
    [Credential-related source omitted]

skills/story-deslop/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "网文去AI味。从表达、叙事用笔、故事因果三层诊断并修复文本,保留作者文风与已定剧情。触发方式:/story-deslop、/去AI味、「去AI味」「这篇太AI了」「网文去AI味」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 4
    description: "网文去AI味。从表达、叙事用笔、故事因果三层诊断并修复文本,保留作者文风与已定剧情。触发方式:/story-deslop、/去AI味、「去AI味」「这篇太AI了」「网文去AI味」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-deslop/scripts/check-ai-patterns.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-deslop/scripts/check-degeneration.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-deslop/scripts/normalize-punctuation.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-deslop/scripts/style-whitelist.js

  • Executable scriptline 1
    Executable file

skills/story-import/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "逆向导入已有小说。将已写好的小说(半成品或完本)反向解析为标准项目目录结构,兼容 story-long-write / story-short-write 后续写作流程;内部复用 story-long-analyze / story-short-analyze 的拆解管道,按篇幅自动分流。触发方式:/story-import、「导入小说」「反向解析」「导入」「把我的书导进来」。" metadata: {"opencla
  • Network accessline 4
    description: "逆向导入已有小说。将已写好的小说(半成品或完本)反向解析为标准项目目录结构,兼容 story-long-write / story-short-write 后续写作流程;内部复用 story-long-analyze / story-short-analyze 的拆解管道,按篇幅自动分流。触发方式:/story-import、「导入小说」「反向解析」「导入」「把我的书导进来」。" metadata: {"openclaw":{"source":"h
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-import/scripts/build_outline_brief.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 202
    "  " + line for line in summary_lines(summary.read_text(encoding="utf-8").lstrip("<U+FEFF>"))]
  • Possible obfuscationline 246
    "\n---\n\n<!-- 资料:outline-reverse-rules.md -->\n\n" + RULES.read_text(encoding="utf-8").lstrip("<U+FEFF>").strip()]

skills/story-import/scripts/check-outline-contract.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 121
    const text = fs.readFileSync(file, 'utf8').replace(/^<U+FEFF>/, '')

skills/story-import/scripts/outline_view.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-import/scripts/tracking_commit.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-import/scripts/wordcount_core.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-analyze/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "长篇网文拆文。保留黄金三章、逐章摘要、剧情、情绪、节奏、角色、设定和文风接口,以连续章节块完成因果、双时间线、关系与三维节奏分析;兼容旧成果直接使用、按需增强和断点续跑。含可选三层灵感库管道(灵感库、跨书灵感聚合、更新灵感库)。触发方式:/story-long-analyze、/长篇拆文、「帮我拆这本书」「拆这本书」「分析黄金三章」「深度拆解」「完整拆解」或提供小说文本文件路径。" metadata: {"opencl
  • Network accessline 4
    description: "长篇网文拆文。保留黄金三章、逐章摘要、剧情、情绪、节奏、角色、设定和文风接口,以连续章节块完成因果、双时间线、关系与三维节奏分析;兼容旧成果直接使用、按需增强和断点续跑。含可选三层灵感库管道(灵感库、跨书灵感聚合、更新灵感库)。触发方式:/story-long-analyze、/长篇拆文、「帮我拆这本书」「拆这本书」「分析黄金三章」「深度拆解」「完整拆解」或提供小说文本文件路径。" metadata: {"openclaw":{"source":"
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-long-analyze/scripts/build_chapter_index.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-analyze/scripts/inspect_existing_assets.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-analyze/scripts/inspiration_index.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 80
    return "<U+FEFF>" + buffer.getvalue()

skills/story-long-analyze/scripts/manage_analysis_run.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 759
    [Credential-related source omitted]
  • Access to secretsline 806
    [Credential-related source omitted]

skills/story-long-analyze/scripts/render_relation_chart.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 260
    [Credential-related source omitted]

skills/story-long-scan/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "长篇网文扫榜。分析起点、番茄、晋江、七猫等平台排行榜与新书数据,提炼市场趋势与热门题材。触发方式:/story-long-scan、/长篇扫榜、「长篇什么火」「起点排行」「扫七猫新书」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 4
    description: "长篇网文扫榜。分析起点、番茄、晋江、七猫等平台排行榜与新书数据,提炼市场趋势与热门题材。触发方式:/story-long-scan、/长篇扫榜、「长篇什么火」「起点排行」「扫七猫新书」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-long-scan/references/platform-ciweimao.md

  • Network accessline 24
    终端提示「未解析到榜单」或文件头「数据质量」标了问题:在 Chrome 里打开 `https://www.ciweimao.com/rank-index`,确认页面正常、没有跳到登录或验证页,再重采。

skills/story-long-scan/references/platform-fanqie.md

  • Network accessline 33
    文件头「数据质量」标 `[标题解析异常]`(书名多为 `(标题待解析)`):多半是被登录或验证页拦住,或页面改版。在已登录的 Chrome 里手动打开任一 `https://fanqienovel.com/page/{bookId}`,确认页面正常、不是验证页;报 `CDP 无响应` 就按 browser-cdp 重新启动 Chrome。确认正常后重采。

skills/story-long-scan/scripts/aggregate-rank.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 171
    const text = fs.readFileSync(filePath, "utf8").replace(/^<U+FEFF>/, "");

skills/story-long-scan/scripts/cdp-utils.js

  • Executable scriptline 1
    Executable file

skills/story-long-scan/scripts/ciweimao-rank-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 22
    const RANK_URL = "https://www.ciweimao.com/rank-index";
  • Network accessline 109
    if(t&&t.length>byId[id].length)byId[id]=t;     });     return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.ciweimao.com/book/'+id};});
  • Network accessline 110
    });     return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.ciweimao.com/book/'+id};});   })())`;
  • Network accessline 111
    return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.ciweimao.com/book/'+id};});

skills/story-long-scan/scripts/fanqie-rank-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 342
    const initCatId = ch === "1" ? "1141" : "1139"; // 男频:西方奇幻 / 女频:古风世情   const initUrl = `https://fanqienovel.com/rank/${ch}_${type}_${initCatId}`;
  • Network accessline 343
    const initUrl = `https://fanqienovel.com/rank/${ch}_${type}_${initCatId}`;
  • Network accessline 394
    try {       ab(PORT, "open", `https://fanqienovel.com${cat.href}`);
  • Network accessline 395
    ab(PORT, "open", `https://fanqienovel.com${cat.href}`);
  • Network accessline 429
    bodyLines.push(`**最新更新:** ${b.lastChapterTitle || "未知"}`);         bodyLines.push(`**bookId:** ${b.bookId}`);         bodyLines.push(`[作品页](https://fanqienovel.com/page/${b.bookId})`);
  • Network accessline 430
    bodyLines.push(`**bookId:** ${b.bookId}`);         bodyLines.push(`[作品页](https://fanqienovel.com/page/${b.bookId})`);         const desc = cleanDesc(info.desc);
  • Network accessline 431
    bodyLines.push(`[作品页](https://fanqienovel.com/page/${b.bookId})`);
  • Network accessline 465
    console.error(       `  ✗ ${chLabel}${tyLabel}:${totalBooks} 本全部标题解析失败。多为详情页结构变动或登录/验证拦截,` +       `请在 Chrome 内手动打开任一 https://fanqienovel.com/page/{bookId} 确认页面正常。`
  • Network accessline 466
    `  ✗ ${chLabel}${tyLabel}:${totalBooks} 本全部标题解析失败。多为详情页结构变动或登录/验证拦截,` +       `请在 Chrome 内手动打开任一 https://fanqienovel.com/page/{bookId} 确认页面正常。`     );
  • Network accessline 467
    `请在 Chrome 内手动打开任一 https://fanqienovel.com/page/{bookId} 确认页面正常。`
  • Network accessline 517
    const ids = [];   for (let page = 1; page <= PAGES; page++) {     const url = `https://fanqienovel.com/library/${seg}/page_${page}?sort=hottes`;
  • Network accessline 518
    for (let page = 1; page <= PAGES; page++) {     const url = `https://fanqienovel.com/library/${seg}/page_${page}?sort=hottes`;     ab(PORT, "open", url);
  • Network accessline 519
    const url = `https://fanqienovel.com/library/${seg}/page_${page}?sort=hottes`;
  • Network accessline 561
    body.push(`**最新更新:** ${info.lastChapterTitle || "未知"}`);     body.push(`**bookId:** ${id}`);     body.push(`[作品页](https://fanqienovel.com/page/${id})`);
  • Network accessline 562
    body.push(`**bookId:** ${id}`);     body.push(`[作品页](https://fanqienovel.com/page/${id})`);     const desc = cleanDesc(info.desc);
  • Network accessline 563
    body.push(`[作品页](https://fanqienovel.com/page/${id})`);
  • Network accessline 575
    `# 番茄 · ${listName}`,     "",     `- 来源:https://fanqienovel.com/library/${seg}/page_1?sort=hottes`,
  • Network accessline 576
    "",     `- 来源:https://fanqienovel.com/library/${seg}/page_1?sort=hottes`,     `- 筛选:${filters || "不限"};按「最热」排序,取前 ${PAGES} 页`,
  • Network accessline 577
    `- 来源:https://fanqienovel.com/library/${seg}/page_1?sort=hottes`,

skills/story-long-scan/scripts/jjwxc-rank-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 29
    const BASE_URL = "https://www.jjwxc.net/topten.php";
  • Network accessline 114
    function buildDetailJS(ids) {   return `Promise.all(${JSON.stringify(ids)}.map(function(id){     return fetch('/onebook.php?novelid='+id)
  • Network accessline 115
    return `Promise.all(${JSON.stringify(ids)}.map(function(id){     return fetch('/onebook.php?novelid='+id)       .then(function(r){return r.arrayBuffer()})
  • Network accessline 116
    return fetch('/onebook.php?novelid='+id)
  • Network accessline 314
    const meta = seg.filter(Boolean).join(" · ");           if (meta) lines.push(`*${meta}*`);           if (b.novelid) lines.push(`[作品页](https://www.jjwxc.net/onebook.php?novelid=${b.novelid})`);
  • Network accessline 315
    if (meta) lines.push(`*${meta}*`);           if (b.novelid) lines.push(`[作品页](https://www.jjwxc.net/onebook.php?novelid=${b.novelid})`);           lines.push("");
  • Network accessline 316
    if (b.novelid) lines.push(`[作品页](https://www.jjwxc.net/onebook.php?novelid=${b.novelid})`);

skills/story-long-scan/scripts/qidian-rank-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 40
    const PC_BASE_URL = "https://www.qidian.com/rank";
  • Network accessline 41
    const MOBILE_BASE_URL = "https://m.qidian.com";
  • Network accessline 90
    id: "sanjiang",     label: "三江推荐",     baseUrl: "https://www.qidian.com/sanjiang/",
  • Network accessline 91
    label: "三江推荐",     baseUrl: "https://www.qidian.com/sanjiang/",     mobilePath: "/sanjiang/",
  • Network accessline 92
    baseUrl: "https://www.qidian.com/sanjiang/",
  • Network accessline 98
    id: "library",     label: "男频书库人气新书",     baseUrl: "https://www.qidian.com/all/action0-size1-update1/",
  • Network accessline 99
    label: "男频书库人气新书",     baseUrl: "https://www.qidian.com/all/action0-size1-update1/",     library: true,
  • Network accessline 100
    baseUrl: "https://www.qidian.com/all/action0-size1-update1/",
  • Network accessline 509
    Accept: "*/*",   "Accept-Encoding": "identity",   Referer: "https://www.qidian.com/",
  • Network accessline 510
    "Accept-Encoding": "identity",   Referer: "https://www.qidian.com/", };
  • Network accessline 511
    Referer: "https://www.qidian.com/",
  • Network accessline 901
    bookId,     title,     url: `https://www.qidian.com/book/${bookId}/`,
  • Network accessline 902
    title,     url: `https://www.qidian.com/book/${bookId}/`,     author,
  • Network accessline 903
    url: `https://www.qidian.com/book/${bookId}/`,

skills/story-long-scan/scripts/qimao-rank-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 27
    const RANK_URL = "https://www.qimao.com/paihang";
  • Network accessline 109
    }     });     return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.qimao.com/shuku/'+id+'/'};});
  • Network accessline 110
    });     return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.qimao.com/shuku/'+id+'/'};});   })())`;
  • Network accessline 111
    return order.map(function(id){return {bookId:id,title:byId[id],url:'https://www.qimao.com/shuku/'+id+'/'};});
  • Network accessline 301
    function libraryPageUrl(page) {   return `https://${LIBRARY_HOST}/shuku/a-a-a-1-1-a-0-click-${page}/`;
  • Network accessline 302
    return `https://${LIBRARY_HOST}/shuku/a-a-a-1-1-a-0-click-${page}/`;
  • Network accessline 306
    function categoryUrl(mainId) {   return `https://${LIBRARY_HOST}/shuku/a-${mainId}-a-a-a-a-a-click-1/`;
  • Network accessline 307
    return `https://${LIBRARY_HOST}/shuku/a-${mainId}-a-a-a-a-a-click-1/`;
  • Network accessline 478
    bookId,       title: anchor ? htmlText(anchor[2]) : "",       url: bookId ? `https://${LIBRARY_HOST}/shuku/${bookId}/` : "",
  • Network accessline 479
    title: anchor ? htmlText(anchor[2]) : "",       url: bookId ? `https://${LIBRARY_HOST}/shuku/${bookId}/` : "",       author: text("s-author"),
  • Network accessline 480
    url: bookId ? `https://${LIBRARY_HOST}/shuku/${bookId}/` : "",

skills/story-long-write/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "长篇网文规划与写作。支持只讨论结构、只写大纲或指定细纲,明确要求正文后再写章节。触发方式:/story-long-write、/写长篇、「帮我开书」「定设定」「出卷纲」「规划剧情」「写大纲」「补细纲」「日更」「续写」「继续写」「修改第X章」「回炉」「重写第X章」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-clau
  • Network accessline 4
    description: "长篇网文规划与写作。支持只讨论结构、只写大纲或指定细纲,明确要求正文后再写章节。触发方式:/story-long-write、/写长篇、「帮我开书」「定设定」「出卷纲」「规划剧情」「写大纲」「补细纲」「日更」「续写」「继续写」「修改第X章」「回炉」「重写第X章」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-long-write/scripts/author_memory_commit.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-write/scripts/build_architect_brief.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 79
    return path.read_text(encoding="utf-8").lstrip("<U+FEFF>")

skills/story-long-write/scripts/build_writer_prompt.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 74
    return io.open(path, encoding="utf-8").read().lstrip("<U+FEFF>")

skills/story-long-write/scripts/check-ai-patterns.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-long-write/scripts/check-degeneration.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-long-write/scripts/check-outline-contract.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 121
    const text = fs.readFileSync(file, 'utf8').replace(/^<U+FEFF>/, '')

skills/story-long-write/scripts/check-outline-copy.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 50
    return { ok: true, text: fs.readFileSync(p, 'utf8').replace(/^<U+FEFF>/, '') }

skills/story-long-write/scripts/convert_outline_format.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-write/scripts/normalize-punctuation.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-long-write/scripts/outline_view.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-write/scripts/storyctl.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-write/scripts/style-whitelist.js

  • Executable scriptline 1
    Executable file

skills/story-long-write/scripts/template_fence.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Possible obfuscationline 34
    lines = text.lstrip("<U+FEFF>").split("\n")

skills/story-long-write/scripts/tracking_commit.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-long-write/scripts/wordcount_core.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-publish/SKILL.md

  • Network accessline 2
    name: story-publish description: "小说发布准备:调用即生成并保存发布资料,缺失字段留空;按平台整理书名、笔名、分类、标签及所需简介。触发方式:/story-publish、/发布资料、「填写平台建书资料」「建书表单」「起书名/写简介/选标签用于发布」;正文累计约 2 万字、准备上架时也适用。当前适配番茄长篇与短故事(短故事无需简介),不代替后台填表或实际发布。" metadata: {"openclaw":{"source":"https:/
  • Network accessline 3
    description: "小说发布准备:调用即生成并保存发布资料,缺失字段留空;按平台整理书名、笔名、分类、标签及所需简介。触发方式:/story-publish、/发布资料、「填写平台建书资料」「建书表单」「起书名/写简介/选标签用于发布」;正文累计约 2 万字、准备上架时也适用。当前适配番茄长篇与短故事(短故事无需简介),不代替后台填表或实际发布。" metadata: {"openclaw":{"source":"https://github.com/zenstory
  • Network accessline 4
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-publish/scripts/check-publish-format.py

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 122
    lines = text.lstrip("<U+FEFF>").splitlines()

skills/story-review/SKILL.md

  • Network accessline 3
    version: 1.1.1 description: "多视角对抗式审查。full/lean 模式在已部署 reviewer agents 时并行 spawn;缺失/异常 agents 或 spawn 失败时自动降级 solo,参考文件不可读时使用内置 rubric fallback。触发方式:/story-review、/审查、「审查一下」「帮我审一下」。" metadata: {"openclaw":{"source":"https://github.com/zenst
  • Network accessline 4
    description: "多视角对抗式审查。full/lean 模式在已部署 reviewer agents 时并行 spawn;缺失/异常 agents 或 spawn 失败时自动降级 solo,参考文件不可读时使用内置 rubric fallback。触发方式:/story-review、/审查、「审查一下」「帮我审一下」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-review/scripts/check-ai-patterns.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-review/scripts/check-degeneration.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-review/scripts/normalize-punctuation.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-review/scripts/style-whitelist.js

  • Executable scriptline 1
    Executable file

skills/story-review/scripts/tracking_commit.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-review/scripts/wordcount_core.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/SKILL.md

  • Network accessline 3
    version: 1.3.8 description: "网文写作工具集基础设施部署与检查。为 Claude Code / OpenCode / Codex / Google Antigravity / ZCode / OpenClaw / Reasonix 提供内置适配;Web AI / 通用 Agent 可走 skills + AGENTS.md 文件模式。触发方式:/story-setup、$story-setup、「准备写书」「帮我搭一下环境」「配置写作项目」「检查写
  • Network accessline 4
    description: "网文写作工具集基础设施部署与检查。为 Claude Code / OpenCode / Codex / Google Antigravity / ZCode / OpenClaw / Reasonix 提供内置适配;Web AI / 通用 Agent 可走 skills + AGENTS.md 文件模式。触发方式:/story-setup、$story-setup、「准备写书」「帮我搭一下环境」「配置写作项目」「检查写作环境」。" metadata
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-setup/UPGRADING.md

  • Dangerous shell operationline 69
    1. 升级 OpenCode:先卸载旧包 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli`(或 `curl -fsSL https://opencode.ai/v2/install | bash`),确认 `opencode --version` 为 2.x。两个包都提供 `opencode` 命令,不先卸载旧包时 PATH 上可能仍是 1.x。
  • Network accessline 69
    1. 升级 OpenCode:先卸载旧包 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli`(或 `curl -fsSL https://opencode.ai/v2/install | bash`),确认 `opencode --version` 为 2.x。两个包都提供 `opencode` 命令,不先卸载旧包时 PATH 上可能仍是 1.x。
  • Network accessline 113
    claude plugin marketplace update oh-story-skills    # 仅在 catalog 尚不存在时:    claude plugin marketplace add https://github.com/zenstory-ai/oh-story-claudecode
  • Network accessline 115
    claude plugin marketplace add https://github.com/zenstory-ai/oh-story-claudecode
  • Network accessline 124
    5. 新开 Claude Code 会话,使用 `/oh-story:story-setup` 或 `/oh-story:story dashboard`。命令与 manifest 格式见 [Claude Code 插件参考](https://code.claude.com/docs/en/plugins-reference)。
  • Network accessline 128
    在 Plugin Management 中卸载受影响的旧条目,刷新市场;必要时重新添加本仓库,再安装一个 `oh-story`。沿用界面中的市场名(`oh-story-skills` 或 `oh-story-zcode`),避免重复安装。若无法卸载,保留数据备份,附 ZCode 版本与界面现象联系官方支持,不要清空全部缓存或手改缓存 JSON。操作说明见 [ZCode 插件文档](https://zcode.z.ai/en/docs/plugin)。

skills/story-setup/references/antigravity/hooks/story_antigravity_hook.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-setup/references/antigravity/hooks/story_hook_core.js

  • Executable scriptline 1
    Executable file

skills/story-setup/references/codex/agents/story-researcher.toml

  • Network accessline 64
    | 引擎 | URL 格式 | 何时使用 | |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 65
    |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 | | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 66
    | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 67
    | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 91
    ```bash node -e "require('http').get('http://127.0.0.1:'+process.argv[1]+'/json/version',{timeout:3000},r=>console.log(r.statusCode===200?'CDP_AVAILABLE':'CDP_UNAVAILABLE')).on('timeout',function(){this.destroy()}).on('error',()=>console.lo
  • Network accessline 92
    node -e "require('http').get('http://127.0.0.1:'+process.argv[1]+'/json/version',{timeout:3000},r=>console.log(r.statusCode===200?'CDP_AVAILABLE':'CDP_UNAVAILABLE')).on('timeout',function(){this.destroy()}).on('error',()=>console.log('CDP_U
  • Network accessline 116
    ```bash # Google 搜索(默认) agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 117
    # Google 搜索(默认) agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())" agent-browser --cdp {cdp_port} wait 5000
  • Dangerous shell operationline 118
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 118
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 131
    **页面加载失败检测**:如果 snapshot 中不包含搜索结果特征(如链接列表、结果标题),视为加载失败: - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 132
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Network accessline 132
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 141
    agent-browser --cdp {cdp_port} eval 'JSON.stringify(Array.from(document.querySelectorAll("a[href]")).filter(a=>a.href&&!a.href.includes("google.com")&&!a.href.includes("bing.com")&&!a.href.includes("javascript:")).slice(0,10).map(a=>({text:
  • Dangerous shell operationline 150
    agent-browser --cdp {cdp_port} eval "window.location.replace('{提取到的URL}')"
  • Dangerous shell operationline 157
    agent-browser --cdp {cdp_port} eval 'document.body.innerText.substring(0,8000)'

skills/story-setup/references/codex/hooks/run-story-hook.cmd

  • Executable scriptline 1
    Executable file

skills/story-setup/references/codex/hooks/run-story-hook.sh

  • Executable scriptline 1
    #!/bin/sh

skills/story-setup/references/codex/hooks/story_codex_hook.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 72
    [Credential-related source omitted]

skills/story-setup/references/deploy-opencode.md

  • Network accessline 9
    1. 运行 `opencode --version`,取第一个 `主.次.修` 版本号:    - 主版本 ≥ 2 → 继续    - 主版本 < 2 → 停止 OpenCode 部署(其它 target 照常),告诉用户先升级到 2.x(先 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli` 或 `curl -fsSL https://opencode.ai/v2/install | bash`),装好后重跑 story-s
  • Network accessline 10
    - 主版本 ≥ 2 → 继续    - 主版本 < 2 → 停止 OpenCode 部署(其它 target 照常),告诉用户先升级到 2.x(先 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli` 或 `curl -fsSL https://opencode.ai/v2/install | bash`),装好后重跑 story-setup    - 命令不可用或解析不出版本 → 同样停止 OpenCode 部署,请用户在自己
  • Dangerous shell operationline 11
    - 主版本 < 2 → 停止 OpenCode 部署(其它 target 照常),告诉用户先升级到 2.x(先 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli` 或 `curl -fsSL https://opencode.ai/v2/install | bash`),装好后重跑 story-setup
  • Network accessline 11
    - 主版本 < 2 → 停止 OpenCode 部署(其它 target 照常),告诉用户先升级到 2.x(先 `npm rm -g opencode-ai`,再 `npm i -g @opencode/cli` 或 `curl -fsSL https://opencode.ai/v2/install | bash`),装好后重跑 story-setup
  • Network accessline 157
    「部署明细」只留一行:模型写在 `.opencode/agents/{agent名}.md` frontmatter 的 `model:`,可用模型见 `opencode models`,定价见 https://models.dev/。

skills/story-setup/references/deploy-zcode.md

  • Network accessline 19
    **ZCode 支持子代理与插件角色**:oh-story 插件通过 manifest 的 `agents` 注册七个专业角色;使用当前运行时的 `Agent` 工具,参数以其 schema 为准。不要创建 `.zcode/agents/` 或修改用户 home:官方用户级定义与插件注册不是 workspace 目录发现。独立 Skills 安装不会自动注册插件角色,缺角色时提示启用/更新 oh-story 插件,仍不可用才 solo/direct。依据:[插件](https

skills/story-setup/references/openclaw/AGENTS.md.tmpl

  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 31
    [Credential-related source omitted]

skills/story-setup/references/opencode/agents/story-researcher.md

  • Network accessline 85
    | 引擎 | URL 格式 | 何时使用 | |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 86
    |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 | | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 87
    | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 88
    | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 113
    node -e "require('http').get('http://127.0.0.1:'+process.argv[1]+'/json/version',{timeout:3000},r=>console.log(r.statusCode===200?'CDP_AVAILABLE':'CDP_UNAVAILABLE')).on('timeout',function(){this.destroy()}).on('error',()=>console.log('CDP_U
  • Network accessline 138
    # Google 搜索(默认) agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Dangerous shell operationline 139
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 139
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 152
    **页面加载失败检测**:如果 snapshot 中不包含搜索结果特征(如链接列表、结果标题),视为加载失败: - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 153
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Network accessline 153
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 162
    agent-browser --cdp {cdp_port} eval 'JSON.stringify(Array.from(document.querySelectorAll("a[href]")).filter(a=>a.href&&!a.href.includes("google.com")&&!a.href.includes("bing.com")&&!a.href.includes("javascript:")).slice(0,10).map(a=>({text:
  • Dangerous shell operationline 171
    agent-browser --cdp {cdp_port} eval "window.location.replace('{提取到的URL}')"
  • Dangerous shell operationline 178
    agent-browser --cdp {cdp_port} eval 'document.body.innerText.substring(0,8000)'

skills/story-setup/references/opencode/plugin.ts

  • Executable scriptline 1
    Executable file

skills/story-setup/references/opencode/pre-commit.sh

  • Executable scriptline 1
    #!/bin/sh

skills/story-setup/references/opencode/story_hook_core.js

  • Executable scriptline 1
    Executable file

skills/story-setup/references/reasonix/AGENTS.md.tmpl

  • Access to secretsline 18
    [Credential-related source omitted]
  • Access to secretsline 32
    [Credential-related source omitted]

skills/story-setup/references/templates/agents/story-researcher.md

  • Network accessline 69
    | 引擎 | URL 格式 | 何时使用 | |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 70
    |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 | | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 71
    | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 72
    | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 97
    node -e "require('http').get('http://127.0.0.1:'+process.argv[1]+'/json/version',{timeout:3000},r=>console.log(r.statusCode===200?'CDP_AVAILABLE':'CDP_UNAVAILABLE')).on('timeout',function(){this.destroy()}).on('error',()=>console.log('CDP_U
  • Network accessline 122
    # Google 搜索(默认) agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Dangerous shell operationline 123
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 123
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 136
    **页面加载失败检测**:如果 snapshot 中不包含搜索结果特征(如链接列表、结果标题),视为加载失败: - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 137
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Network accessline 137
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 146
    agent-browser --cdp {cdp_port} eval 'JSON.stringify(Array.from(document.querySelectorAll("a[href]")).filter(a=>a.href&&!a.href.includes("google.com")&&!a.href.includes("bing.com")&&!a.href.includes("javascript:")).slice(0,10).map(a=>({text:
  • Dangerous shell operationline 155
    agent-browser --cdp {cdp_port} eval "window.location.replace('{提取到的URL}')"
  • Dangerous shell operationline 162
    agent-browser --cdp {cdp_port} eval 'document.body.innerText.substring(0,8000)'

skills/story-setup/references/templates/hooks/check-prose-after-write.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/detect-story-gaps.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/guard-outline-before-prose.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/lib/common.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/lib/sentinel.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/post-compact.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/pre-compact.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/session-end.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/templates/hooks/session-start.sh

  • Executable scriptline 1
    #!/bin/bash
  • Dangerous shell operationline 43
    rm -f "$ROOT/.claude/.agents-pending-restart" 2>/dev/null || true
  • Network accessline 65
    if ! node -e "" >/dev/null 2>&1; then     OUTPUT+="[WARN] 检测不到 node 运行时:正文兜底网/commit 格式提示/连续性检查已停用(大纲拦截仍有纯 bash 兜底)。${NL}"     OUTPUT+="  修复:安装 Node.js(https://nodejs.org,或 nvm / brew install node)后新开会话即可恢复。${NL}${NL}"
  • Network accessline 66
    OUTPUT+="[WARN] 检测不到 node 运行时:正文兜底网/commit 格式提示/连续性检查已停用(大纲拦截仍有纯 bash 兜底)。${NL}"     OUTPUT+="  修复:安装 Node.js(https://nodejs.org,或 nvm / brew install node)后新开会话即可恢复。${NL}${NL}"     HAS_CONTENT=true
  • Network accessline 67
    OUTPUT+="  修复:安装 Node.js(https://nodejs.org,或 nvm / brew install node)后新开会话即可恢复。${NL}${NL}"
  • Network accessline 162
    story_update_check() {   [ -n "${STORY_NO_UPDATE_CHECK:-}" ] && return 0   command -v curl >/dev/null 2>&1 || return 0
  • Network accessline 163
    [ -n "${STORY_NO_UPDATE_CHECK:-}" ] && return 0   command -v curl >/dev/null 2>&1 || return 0   local vfile=""
  • Network accessline 164
    command -v curl >/dev/null 2>&1 || return 0
  • Network accessline 180
    if [ "$((now - last))" -ge 86400 ]; then     checked=1     latest=$(curl -fsS --max-time 5 "https://api.github.com/repos/zenstory-ai/oh-story-claudecode/releases/latest" 2>/dev/null \
  • Network accessline 181
    checked=1     latest=$(curl -fsS --max-time 5 "https://api.github.com/repos/zenstory-ai/oh-story-claudecode/releases/latest" 2>/dev/null \       | grep -o '"tag_name"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | grep -o '[0-9][0-9.]*' | hea
  • Network accessline 182
    latest=$(curl -fsS --max-time 5 "https://api.github.com/repos/zenstory-ai/oh-story-claudecode/releases/latest" 2>/dev/null \

skills/story-setup/references/templates/hooks/story_hook_cli.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-setup/references/templates/hooks/story_hook_core.js

  • Executable scriptline 1
    Executable file

skills/story-setup/references/templates/hooks/validate-story-commit.sh

  • Executable scriptline 1
    #!/bin/bash

skills/story-setup/references/zcode/agents/story-researcher.md

  • Network accessline 69
    | 引擎 | URL 格式 | 何时使用 | |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 70
    |------|---------|---------| | Google | `https://www.google.com/search?q={query}` | 默认首选 | | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 71
    | Google | `https://www.google.com/search?q={query}` | 默认首选 |
  • Network accessline 72
    | Bing | `https://www.bing.com/search?q={query}` | Google 不可达时自动切换 |
  • Network accessline 97
    node -e "require('http').get('http://127.0.0.1:'+process.argv[1]+'/json/version',{timeout:3000},r=>console.log(r.statusCode===200?'CDP_AVAILABLE':'CDP_UNAVAILABLE')).on('timeout',function(){this.destroy()}).on('error',()=>console.log('CDP_U
  • Network accessline 122
    # Google 搜索(默认) agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Dangerous shell operationline 123
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 123
    agent-browser --cdp {cdp_port} eval "window.location.replace('https://www.google.com/search?'+new URLSearchParams({q:'{搜索词}'}).toString())"
  • Network accessline 136
    **页面加载失败检测**:如果 snapshot 中不包含搜索结果特征(如链接列表、结果标题),视为加载失败: - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 137
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Network accessline 137
    - Google 失败 → 切换 Bing:`eval "window.location.replace('https://www.bing.com/search?...')"` → wait 5000 → 重新 snapshot
  • Dangerous shell operationline 146
    agent-browser --cdp {cdp_port} eval 'JSON.stringify(Array.from(document.querySelectorAll("a[href]")).filter(a=>a.href&&!a.href.includes("google.com")&&!a.href.includes("bing.com")&&!a.href.includes("javascript:")).slice(0,10).map(a=>({text:
  • Dangerous shell operationline 155
    agent-browser --cdp {cdp_port} eval "window.location.replace('{提取到的URL}')"
  • Dangerous shell operationline 162
    agent-browser --cdp {cdp_port} eval 'document.body.innerText.substring(0,8000)'

skills/story-setup/references/zcode/hooks/story_hook_core.js

  • Executable scriptline 1
    Executable file

skills/story-setup/references/zcode/hooks/story_zcode_hook.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-setup/scripts/copy-path-safety.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/scripts/deploy-antigravity-skills.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/scripts/generate-antigravity-agents.mjs

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-setup/scripts/merge-antigravity-hooks.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/scripts/merge-claude-settings.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/scripts/merge-codex-hooks.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-setup/scripts/merge-project-instructions.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-short-analyze/SKILL.md

  • Network accessline 3
    version: 3.1.0 description: "短篇网文拆文。拆解爆款短篇小说(番茄短篇 / 故事会 / 知乎盐言 / 追妻 / 世情 / 重生 / 虐渣等通俗题材)的故事核、结构、情感线、反转设计、写作手法、共鸣层次。单一全量拆解管道:跑完 Stage 2-6 产出完整拆文报告,落盘到 拆文库/{书名}/,下游 story-short-write 同时读拆文报告 + 情节节点 + 写作手法 + 原文 + _meta.json 写下一篇。触发方式:/story-sh
  • Network accessline 4
    description: "短篇网文拆文。拆解爆款短篇小说(番茄短篇 / 故事会 / 知乎盐言 / 追妻 / 世情 / 重生 / 虐渣等通俗题材)的故事核、结构、情感线、反转设计、写作手法、共鸣层次。单一全量拆解管道:跑完 Stage 2-6 产出完整拆文报告,落盘到 拆文库/{书名}/,下游 story-short-write 同时读拆文报告 + 情节节点 + 写作手法 + 原文 + _meta.json 写下一篇。触发方式:/story-short-analyze、/短篇
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-short-scan/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "短篇网文扫榜。分析知乎盐言、七猫、黑岩、点众等平台热门短篇数据,捕捉风口题材。触发方式:/story-short-scan、/短篇扫榜、「短篇什么火」「知乎故事排行」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 4
    description: "短篇网文扫榜。分析知乎盐言、七猫、黑岩、点众等平台热门短篇数据,捕捉风口题材。触发方式:/story-short-scan、/短篇扫榜、「短篇什么火」「知乎故事排行」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-short-scan/scripts/aggregate-rank.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 171
    const text = fs.readFileSync(filePath, "utf8").replace(/^<U+FEFF>/, "");

skills/story-short-scan/scripts/cdp-utils.js

  • Executable scriptline 1
    Executable file

skills/story-short-scan/scripts/dz-browse-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 25
    const CHANNELS = [   { id: "male", label: "男频", tab: "男频", url: "https://www.ishugui.com/browse" },
  • Network accessline 26
    { id: "male", label: "男频", tab: "男频", url: "https://www.ishugui.com/browse" },
  • Network accessline 27
    { id: "female", label: "女频", tab: "女频", url: "https://www.ishugui.com/browse/on3" },
  • Network accessline 95
    var um=card.match(/最新章节[::\\s]*([^·]{1,40})/);       var update=um?um[1].trim():'';       out.push({rank:out.length+1,bookId:id,title:title,score:score,author:author,tag:tag,status:status,words:words,update:update,desc:desc.slice(0,200),url
  • Network accessline 96
    var update=um?um[1].trim():'';       out.push({rank:out.length+1,bookId:id,title:title,score:score,author:author,tag:tag,status:status,words:words,update:update,desc:desc.slice(0,200),url:'https://www.ishugui.com/book/'+id});     });
  • Network accessline 97
    out.push({rank:out.length+1,bookId:id,title:title,score:score,author:author,tag:tag,status:status,words:words,update:update,desc:desc.slice(0,200),url:'https://www.ishugui.com/book/'+id});

skills/story-short-scan/scripts/heiyan-booklist-scraper.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 5
    * ⚠<U+FE0F> 前置条件(必须):  *   1. 启动 Chrome CDP 环境  *   2. 在 Chrome 中手动登录 https://manage.zhangwenpindu.cn
  • Network accessline 6
    *   1. 启动 Chrome CDP 环境  *   2. 在 Chrome 中手动登录 https://manage.zhangwenpindu.cn  *      登录后会生成 Admin-Token cookie,脚本需要它调用后端 API
  • Network accessline 7
    *   2. 在 Chrome 中手动登录 https://manage.zhangwenpindu.cn
  • Network accessline 24
    const BOOKLIST_URL = "https://manage.zhangwenpindu.cn/books/booklist";
  • Network accessline 25
    const API_BASE = "https://ms.zhangwenpindu.cn";
  • Network accessline 49
    const t = safeStr(token);   const js =     "fetch(" + safeStr(API_BASE + "/manage/book/list") + "," +
  • Network accessline 50
    const js =     "fetch(" + safeStr(API_BASE + "/manage/book/list") + "," +     "{method:'POST'," +
  • Network accessline 51
    "fetch(" + safeStr(API_BASE + "/manage/book/list") + "," +
  • Network accessline 64
    const t = safeStr(token);   const js =     "fetch(" + safeStr(API_BASE + "/manage/book/" + encodeURIComponent(bookId)) + "," +
  • Network accessline 65
    [Credential-related source omitted]
  • Network accessline 66
    "fetch(" + safeStr(API_BASE + "/manage/book/" + encodeURIComponent(bookId)) + "," +
  • Network accessline 221
    if (!token) {     console.log("  ✗ 未检测到 Admin-Token(CDP 已连,但当前未登录)");     console.log("  → 请先在 Chrome 中打开 https://manage.zhangwenpindu.cn 并登录");
  • Network accessline 222
    console.log("  ✗ 未检测到 Admin-Token(CDP 已连,但当前未登录)");     console.log("  → 请先在 Chrome 中打开 https://manage.zhangwenpindu.cn 并登录");     console.log("  → 登录后重新运行本脚本");
  • Network accessline 223
    console.log("  → 请先在 Chrome 中打开 https://manage.zhangwenpindu.cn 并登录");

skills/story-short-write/SKILL.md

  • Network accessline 3
    version: 1.0.0 description: "短篇网文写作。辅助短篇小说创作,从构思到成稿,聚焦情绪拉扯与节奏把控。触发方式:/story-short-write、/写短篇、「帮我写一篇短篇」「写个盐言故事」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 4
    description: "短篇网文写作。辅助短篇小说创作,从构思到成稿,聚焦情绪拉扯与节奏把控。触发方式:/story-short-write、/写短篇、「帮我写一篇短篇」「写个盐言故事」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 5
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}

skills/story-short-write/scripts/author_memory_commit.py

  • Executable scriptline 1
    #!/usr/bin/env python3

skills/story-short-write/scripts/check-ai-patterns.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-short-write/scripts/check-degeneration.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-short-write/scripts/check-delivery-contract.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-short-write/scripts/check-outline-copy.js

  • Executable scriptline 1
    #!/usr/bin/env node
  • Possible obfuscationline 50
    return { ok: true, text: fs.readFileSync(p, 'utf8').replace(/^<U+FEFF>/, '') }

skills/story-short-write/scripts/check-phase2-contract.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-short-write/scripts/normalize-punctuation.js

  • Executable scriptline 1
    #!/usr/bin/env node

skills/story-short-write/scripts/style-whitelist.js

  • Executable scriptline 1
    Executable file

skills/story/SKILL.md

  • Network accessline 2
    name: story description: "网络小说工具箱主入口。根据用户需求自动路由到对应 skill,并可启动本地 Dashboard。触发方式:/story、$story、/story dashboard、/网文、「我想写小说」「记住我的写作习惯」「打开工作台」「检查更新」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 3
    description: "网络小说工具箱主入口。根据用户需求自动路由到对应 skill,并可启动本地 Dashboard。触发方式:/story、$story、/story dashboard、/网文、「我想写小说」「记住我的写作习惯」「打开工作台」「检查更新」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}} ---
  • Network accessline 4
    metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
  • Network accessline 155
    1. **当前版本**:读本 skill 同目录的 `VERSION` 文件;缺失则视为未知。本 skill 在写作项目里(如项目下的 `skills/`、`.agents/skills/`、`.zcode/skills/`)时,读到的是项目副本的版本。 2. **最新版本**:优先 `gh release view --json tagName,name,url -R zenstory-ai/oh-story-claudecode` 取 `tagName`;无 gh 用 `
  • Network accessline 156
    2. **最新版本**:优先 `gh release view --json tagName,name,url -R zenstory-ai/oh-story-claudecode` 取 `tagName`;无 gh 用 `curl -fsS --max-time 5 https://api.github.com/repos/zenstory-ai/oh-story-claudecode/releases/latest` 取 `.tag_name`(jq 或 grep)。查不
  • Network accessline 158
    4. **告知**:    - 已最新 → 「已是最新版 vX.Y.Z」。    - 有新版或当前版本未知 → 展示已知版本与 [Releases](https://github.com/zenstory-ai/oh-story-claudecode/releases)/[CHANGELOG](https://github.com/zenstory-ai/oh-story-claudecode/blob/main/CHANGELOG.md),有 release notes 时
  • Network accessline 159
    - 已最新 → 「已是最新版 vX.Y.Z」。    - 有新版或当前版本未知 → 展示已知版本与 [Releases](https://github.com/zenstory-ai/oh-story-claudecode/releases)/[CHANGELOG](https://github.com/zenstory-ai/oh-story-claudecode/blob/main/CHANGELOG.md),有 release notes 时附更新要点,再用宿主可用的提
  • Network accessline 160
    - 有新版或当前版本未知 → 展示已知版本与 [Releases](https://github.com/zenstory-ai/oh-story-claudecode/releases)/[CHANGELOG](https://github.com/zenstory-ai/oh-story-claudecode/blob/main/CHANGELOG.md),有 release notes 时附更新要点,再用宿主可用的提问方式问「现在更新吗?」。选先不 → 不动,告知随时可

skills/story/assets/app.js

  • Executable scriptline 1
    Executable file
  • Network accessline 99
    let response;   try {     response = await fetch(url, options);
  • Network accessline 100
    try {     response = await fetch(url, options);   } catch {
  • Network accessline 101
    response = await fetch(url, options);

skills/story/scripts/dashboard-server.mjs

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 742
    if (!hostHeader) return "";   try {     return new URL(`http://${hostHeader}`).hostname.replace(/^\[|\]$/g, "").toLowerCase();
  • Network accessline 743
    try {     return new URL(`http://${hostHeader}`).hostname.replace(/^\[|\]$/g, "").toLowerCase();   } catch {
  • Network accessline 744
    return new URL(`http://${hostHeader}`).hostname.replace(/^\[|\]$/g, "").toLowerCase();
  • Network accessline 775
    try {       assertLocalRequest(request, allowNetwork);       const url = new URL(request.url || "/", "http://127.0.0.1");
  • Network accessline 776
    assertLocalRequest(request, allowNetwork);       const url = new URL(request.url || "/", "http://127.0.0.1");       if (request.method === "GET" && url.pathname === "/health") {
  • Network accessline 777
    const url = new URL(request.url || "/", "http://127.0.0.1");
  • Network accessline 965
    const port = await listen(server, options.host, options.port);   const displayHost = options.host === "::1" ? "[::1]" : options.host;   const url = `http://${displayHost}:${port}`;
  • Network accessline 967
    const url = `http://${displayHost}:${port}`;

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Combined signals: 1 fact
Declared and executed: 7 facts
Signal confidence: 349 facts

and 299 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md skills/browser-cdp/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md skills/browser-cdp/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md skills/browser-cdp/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md skills/browser-cdp/SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

zenstory-ai/oh-story-claudecode: #175 on hotskills, 8.4k stars

[![zenstory-ai/oh-story-claudecode on hotskills](https://hotskills.dev/badge/zenstory-ai-oh-story-claudecode.svg)](https://hotskills.dev/skill/zenstory-ai-oh-story-claudecode/)