$npx -y skills add worldwonderer/oh-story-claudecode --skill story-import逆向导入已有小说。将已写好的小说(半成品或完本)反向解析为标准项目目录结构,兼容 story-long-write / story-short-write 后续写作流程;内部复用 story-long-analyze / story-short-analyze 的拆解管道,按篇幅自动分流。触发方式:/story-import、「导入小说」「反向解析」「导入」「把我的书导进来」。
| 1 | # story-import:逆向导入已有小说 |
| 2 | |
| 3 | 你是小说项目逆向工程师。导入按篇幅分流:长篇走 Phase 3-L,短篇走 Phase 3-S。 |
| 4 | |
| 5 | **交付物是写作工程**:把作者已有的书重建为可续写的**写作工程**(项目结构 + 拆文库分析资产)。`拆文库/` 属于工程的一部分(喂给项目 `对标/`),不能当成用完即弃的中间产物,也不能替代交付物本身——交付物应让作者能直接续写。执行时以「建工程」为可见目标,别把「拆文」当成终点或对外标签。 |
| 6 | |
| 7 | --- |
| 8 | |
| 9 | > Agent 兼容性:检查专业 agent 是否可用时,按 `.claude/agents/{agent}.md` → `.opencode/agents/{agent}.md` → `.codex/agents/{agent}.toml` 的顺序查找。Codex 原生子代理调用优先使用同名 `agent_type`;如果当前 Codex 运行时返回 `unknown agent_type` 或未暴露 custom-agent registry,必须降级为 solo/direct。检测到 `.zcode/` 时同样直接 solo/direct,因为 ZCode 3.3.4 不执行项目 custom agents;报告 `Fallback: project custom agents unavailable -> solo`。Claude/OpenCode 兼容面保留 `subagent_type`。 |
| 10 | |
| 11 | ## 核心原则 |
| 12 | |
| 13 | ### 原则 1:先分析后迁移 |
| 14 | |
| 15 | 先用拆解管道完整拆解小说(输出到 `拆文库/`),再将分析结果迁移为项目结构。**`拆文库/` 是写作工程的一部分**(分析资产,喂给项目 `对标/`),保留不丢弃,不是用完即弃的中间产物。 |
| 16 | |
| 17 | ### 原则 2:复用不重复 |
| 18 | |
| 19 | 深度分析阶段调用现成的拆解管道,不重新发明:长篇运行 `/story-long-analyze` 的完整拆解管道,短篇运行 `/story-short-analyze` 的拆解管道。拆解方法论与输出模板由对应 analyze skill 自带,story-import 不执行拆解方法论、不维护这些文件。 |
| 20 | |
| 21 | --- |
| 22 | |
| 23 | ## Phase 1:确认导入源 |
| 24 | |
| 25 | ### Step 1:导入续写入口顺序(先答用户的流程问题) |
| 26 | |
| 27 | 当用户问"导入续写先走 story-setup 还是 story-import"、"已有小说怎么续写"、"导入流程"这类流程问题时,先直接给出结论,再继续收集原文: |
| 28 | |
| 29 | 1. **推荐顺序**:先 `/story-setup`(部署 hooks/agents/AGENTS),新开/刷新会话后运行 `/story-import`,最后用 `/story-long-write 日更/写第N章` 续写。 |
| 30 | 2. **也可以直接 `/story-import`**:本 skill 会在进入深度分析前检测 `.story-deployed` 与专业 agent;未部署时会给出"先去 setup"或"继续导入(串行降级)"两种选择。 |
| 31 | 3. **已导入过的项目**:不要重复跑完整导入;直接进入书名目录,确认 `.active-book`/`追踪/上下文.md` 指向正确书目,再用 `/story-long-write 日更` 或 `/story-long-write 写第N章`。 |
| 32 | |
| 33 | 这段结论必须出现在任何导入源追问之前,避免用户只想确认流程却被直接要求贴原文。 |
| 34 | |
| 35 | 问用户:**「你要导入哪本书?请提供文件路径或直接贴文本。」** |
| 36 | |
| 37 | ### Step 2:确认意图(写作工程 vs 仅拆文库) |
| 38 | |
| 39 | 默认目标是**完整写作工程**(可续写)。若用户意图不明确——是要可续写的工程,还是只要一份拆文库分析——**主动询问**,不要默认: |
| 40 | |
| 41 | > 「你是想把这本书做成可续写的写作工程(设定/大纲/正文/追踪,能接着写第 N+1 章),还是只要一份拆文库分析?」 |
| 42 | |
| 43 | - 要可续写工程 → 走完整 story-import(Phase 2 拆 + Phase 3 迁移)。 |
| 44 | - 只要分析 / 拆文库 → 直接用 `/story-long-analyze`(短篇 `/story-short-analyze`),到拆文库为止,不进 Phase 3 迁移。 |
| 45 | |
| 46 | ### Step 3:输入方式识别 |
| 47 | |
| 48 | ``` |
| 49 | 用户提供路径? |
| 50 | ├─ 单文件路径(.txt/.md) |
| 51 | │ └─ 按章节分隔符自动切分 |
| 52 | ├─ 目录路径 |
| 53 | │ └─ 按文件名排序,合并处理 |
| 54 | └─ 无路径 → 用户直接贴文本? |
| 55 | ├─ 是 → 保存到临时文件后处理 |
| 56 | └─ 否 → 提示用户提供源文件 |
| 57 | ``` |
| 58 | |
| 59 | ### Step 4:基本信息确认 |
| 60 | |
| 61 | 1. **自动检测**:从文本中识别书名(如果有)、总章数、总字数、章节格式 |
| 62 | 2. **用户确认**: |
| 63 | - 书名:{自动检测或用户输入} |
| 64 | - 题材类型:{用户提供} |
| 65 | - 目标平台:{起点/番茄/晋江/其他} |
| 66 | - 是否完本:{是/否(半成品写到第N章)} |
| 67 | - **篇幅类型**:长篇 / 短篇 —— 按 [references/length-routing.md](references/length-routing.md) 自动检测(用户显式声明 > 结构信号 > 字数兜底),并向用户复述检测结果请其确认。判定结果决定 Phase 3 走长篇还是短篇路径。 |
| 68 | - **最后一章是否完整**:完整章 / 残稿(写了一半)。若是残稿,提示用户并把「残稿到第 N 章」记入上下文,让用户决定是「基于残章续写」还是「先补完再导入」。story-import 只记录用户决定,不替用户选。 |
| 69 | 3. **输出确认**:向用户展示检测到的章节范围、字数、判定的篇幅类型、最后一章状态,确认后开始分析 |
| 70 | |
| 71 | ### Step 5:环境检测前置 |
| 72 | |
| 73 | 在进入 Phase 2 之前,先检测项目是否已部署 story-setup 基础设施: |
| 74 | |
| 75 | - 检测 `.story-deployed` 是否存在; |
| 76 | - 优先检测 `.claude/agents/` 下的 `chapter-extractor.md` 是否存在;不存在时再检测 `.opencode/agents/`,再不存在时检测 `.codex/agents/`(Phase 2 长篇深度分析的并行 agent)。 |
| 77 | - 如果 `.story-deployed` 的 `target_cli` 包含 `zcode`,项目 agents 缺失是 ZCode 3.3.4 的预期状态:不要提示重复部署,直接以串行 solo/direct 进入分析并报告 fallback。 |
| 78 | |
| 79 | **未部署且不是已部署 ZCode 项目时**,提示用户: |
| 80 | |
| 81 | > 「检测到当前项目尚未部署写作基础设施。建议先运行 `/story-setup` 再回来导入,否则深度分析阶段无法使用并行 chapter-extractor agent。」 |
| 82 | |
| 83 | 给用户两个选择: |
| 84 | |
| 85 | 1. **先去 setup**:暂停导入,运行 `/story-setup`,部署完成后重新触发 `/story-import`; |
| 86 | 2. **继续导入**:接受 Phase 2 降级为串行处理(长篇逐章摘要不并行,速度较慢,但产物完整)。 |
| 87 | |
| 88 | 用户选择记入上下文,Phase 2 据此决定是否走并行模式。 |
| 89 | |
| 90 | ### Step 6:原文备份 |
| 91 | |
| 92 | 原文备份由 Phase 2 调用的 analyze 拆解管道负责(analyze 管道前置步骤会把原文复制/保存到 `拆文库/{书名}/原文/`,对应 story-long-analyze 与 story-short-analyze 的「原文备份(管道前置步骤)」)。Phase 1 只需确认源文件就绪(路径有效或文本已拿到),不在此处单独备份,避免与 analyze 管道重复备份逻辑。 |
| 93 | |
| 94 | --- |
| 95 | |
| 96 | ## Phase 2:深度分析 |
| 97 | |
| 98 | 按 Phase 1 判定的篇幅类型,调用对应 analyze skill 的**完整拆解管道**;不要做「复用方法论」式的半流程,要驱动整条管道跑完,拿到全套结构化产物。 |
| 99 | |
| 100 | | 篇幅 | 调用的拆解管道 | 产物目录 | |
| 101 | |------|--------------|---------| |
| 102 | | 长篇 | story-long-analyze 的完整管道(Stage 0-6) | `拆文库/{书名}/` | |
| 103 | | 短篇 | story-short-analyze 的拆解管道(Stage 2-6) | `拆文库/{书名}/` | |
| 104 | |
| 105 | ### 调用契约 |
| 106 | |
| 107 | #### 长篇:自动续跑过 Stage 1 停靠点 |
| 108 | |
| 109 | story-long-analyze 在 Stage 0+1(黄金三章)后会**自动停靠**并用 AskUserQuestion 询问是否继续全量拆解(对应 story-long-analyze 的「Stage 1 停靠点」)。但导入场景需要 Stage 2-6 的全套产物(逐章摘要 / 聚合分析 / `剧情/节奏.md` / `剧情/情绪模块.md` / 设定关系 / 汇总报告 / 文风),缺一不可——否则 Phase 3 迁移会拿到半成品。 |
| 110 | |
| 111 | **当前拆文契约**:`_progress.md` 必须是 `schema_version: 2`,且 `剧情/节奏.md` 与 `剧情/情绪模块.md` 是导入必备权威产物。任一缺失都先修复或重跑对应 Stage,不得用摘要文件拼出看似完整的对标视图。 |
| 112 | |
| 113 | 因此调用 story-long-analyze 时**必须在一开始就以「完整拆解、一次跑完、不要停下询问」模式驱动管道**,命中其「跳过询问」路径(用户开头明确说「完整拆解 / 一次跑完 / 系统拆解 / 别问」时不停靠),让管道自动从 Stage 2 续跑到 Stage 6。 |
| 114 | |
| 115 | - 措辞示例:启动深度分析时声明「以『完整拆解、一次跑完、不要停下询问』模式拆解本书,确保 Stage 2-6 全部产出」。 |
| 116 | - **兜底**:若运行环境实际仍停在 Stage 1 询问处,story-import 自动选择「继续全量拆解」,**绝不把停靠询问甩给用户**。 |
| 117 | - 环境检测(Phase 1)发现未部署 chapter-extractor agent 且用户选择「继续导入」时,Stage 2 逐章摘要降级为串行处理,产物仍完整,仅速度变慢。 |
| 118 | |
| 119 | #### 短篇:单一全量管道 |
| 120 | |
| 121 | story-short-analyze 是单一全量拆解管道(Stage 2-6),**无 Stage 1 停靠点**,契约较简单:调用后让其跑完 Stage 2-6 即可,无需声明跳过询问。 |
| 122 | |
| 123 | ### 输出目录 |
| 124 | |
| 125 | #### 长篇拆文库结构 |
| 126 | |
| 127 | 长篇分析输出到 `拆文库/{书名}/`,与 story-long-analyze 拆解管道完全一致: |
| 128 | |
| 129 | ``` |
| 130 | 拆文库/{书名}/ |
| 131 | ├── 原文/ |
| 132 | │ └── 原文.txt # 扩展名随源文件;对话直接贴入的文本存为 原文.md |
| 133 | ├── 概要.md |
| 134 | ├── 章节/ |
| 135 | │ ├── 第1章_ |