webnovel-init
深度初始化网文项目。通过分阶段交互收集完整创作信息,生成可直接进入规划与写作的项目骨架与约束文件。
Source facts
- Repository
- lujih/webnovel-writer-opencode
- Last source activity
- June 9, 2026 at 06:25
- Detected SKILL.md language
- Chinese
- Stars
- 226
- Forks
- 38
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
File Explorer
20 filesShowing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- webnovel-init
- description
- 深度初始化网文项目。通过分阶段交互收集完整创作信息,生成可直接进入规划与写作的项目骨架与约束文件。
- compatibility
- opencode
# Project Initialization (Deep Mode)
## 目标
- 通过结构化交互收集足够信息,避免"先生成再返工"。
- 产出可落地项目骨架:`.webnovel/state.json`、`设定集/*`、`大纲/总纲.md`、`.webnovel/idea_bank.json`。
- 保证后续 `/webnovel-plan` 与 `/webnovel-write` 可直接运行。
## 执行原则
1. 先收集,再生成;未过充分性闸门,不执行 `init_project.py`。
2. 分波次提问,每轮只问"当前缺失且会阻塞下一步"的信息。
3. 允许调用 `Read/Grep/Bash/Agent/AskUserQuestion/WebSearch/WebFetch` 辅助收集。
4. 用户已明确的信息不重复问;冲突信息优先让用户裁决。
5. Deep 模式优先完整性,允许慢一点,但禁止漏关键字段。
6. 参考书拆解只返回结构化结果给 init 主流程;用户确认前不得写入 `idea_bank.json`、`.story-system`、`设定集`、`大纲`、`正文`、`.webnovel/state.json` 或任何 canon/read model 文件。
## 引用加载策略
路径说明:`references/` 指 skill 私有 `skills/webnovel-init/references/`;`../../references/` 指共享 references。
### md 必读
| Step | Trigger | Reference | 实际路径 |
|------|---------|-----------|---------|
| Step 1 | always | 数据流规范 | `${SKILL_ROOT}/references/system-data-flow.md` |
| Step 1 | always | 题材套路库 | `${SKILL_ROOT}/references/genre-tropes.md` |
| 卖点/题材采集 | always | 题材配置 | `${SKILL_ROOT}/../../references/genre-profiles.md` |
### md 按需
| Step | Trigger | Reference | 实际路径 |
|------|---------|-----------|---------|
| Step 2 | 用户人物扁平 | 角色设计 | `${SKILL_ROOT}/references/worldbuilding/character-design.md` |
| Step 4 | always | 势力格局 | `${SKILL_ROOT}/references/worldbuilding/faction-systems.md` |
| Step 4 | 涉及修仙/玄幻/高武/异能 | 力量体系 | `${SKILL_ROOT}/references/worldbuilding/power-systems.md` |
| Step 4 | always | 世界规则 | `${SKILL_ROOT}/references/worldbuilding/world-rules.md` |
| Step 5 | always | 创意约束 | `${SKILL_ROOT}/references/creativity/creativity-constraints.md` |
| Step 5 | always | 卖点生成 | `${SKILL_ROOT}/references/creativity/selling-points.md` |
| Step 5 | 复合题材 | 题材融合 | `${SKILL_ROOT}/references/creativity/creative-combination.md` |
| Step 5 | 卡顿 | 灵感候选 | `${SKILL_ROOT}/references/creativity/inspiration-collection.md` |
| Step 5 | 题材映射命中 | 反套路库 | `${SKILL_ROOT}/references/creativity/anti-trope-*.md` |
| Step 6 | always | 设定一致性 | `${SKILL_ROOT}/references/worldbuilding/setting-consistency.md` |
### CSV 检索
| Step | Trigger | 检索命令 |
|------|---------|---------|
| 角色/书名/势力设定 | 用户开始设定命名 | `python -X utf8 "${SCRIPTS_DIR}/reference_search.py" --skill init --table 命名规则 --query "{命名对象} {题材}" --genre {题材}` |
## 工具策略(按需)
- `Read/Grep`:读取项目上下文与参考文件(`README.md`、`CLAUDE.md`、`templates/genres/*`、`references/*`)。
- `Bash`:执行 `init_project.py`、文件存在性检查、最小验证命令。
- `Agent`:拆分并行子任务(如题材映射、约束包候选生成、文件验证);Step 1.5 用户选择参考书拆解作为灵感来源时,调用 `deconstruction-agent`。
- `AskUserQuestion`:用于关键分歧裁决、候选方案选择、最终确认。
- `WebSearch`:用于检索最新市场趋势、平台风向、题材数据(可带域名过滤)。
- `WebFetch`:用于抓取已确定来源页面内容并做事实核验。
- 外部检索触发条件:
- 用户明确要求参考市场趋势或平台风向;
- 创意约束需要"时间敏感依据";
- 对题材信息存在明显不确定。
## 交互流程(Deep)
### Step 1:预检与上下文加载
环境设置(bash 命令执行前):
```bash
export WORKSPACE_ROOT="${PWD}"
if [ ! -d "${PWD}/.opencode/scripts" ]; then
echo "ERROR: 缺少目录: ${PWD}/.opencode/scripts" >&2
exit 1
fi
export SCRIPTS_DIR="${PWD}/.opencode/scripts"
```
必须做:
- 确认当前目录可写。
- 解析脚本目录并确认入口存在(仅支持插件目录):
- 固定路径:`${PWD}/.opencode/scripts`
- 入口脚本:`${SCRIPTS_DIR}/webnovel.py`
- 初始化前不要用 `where` 把 `WORKSPACE_ROOT` 解析成书项目根;新项目尚不存在时,`where` 可能命中旧指针或旧项目。
- 只打印工作区与脚本目录,确认生成目标将在工作区下的书名安全化子目录中。
- 加载最小参考:
- `references/system-data-flow.md`(用于校对 init 产物与 plan/write 输入链路)
- `references/genre-tropes.md`
- `templates/genres/`(仅在用户选定题材后按需读取)
输出:
- 进入 Deep 采集前的"已知信息清单"和"待收集清单"。
### Step 1.5:灵感来源询问(可选)
进入故事核采集前,必须先用 `AskUserQuestion` 或直接提问的方式确认用户是否要提供灵感来源。不要默认拆书,也不要把参考作品当作必填项。
建议询问:
```text
你这本书的灵感来源想从哪里开始?可以直接说原创想法,也可以提供参考作品做拆书提炼。若要拆书,请给参考书名+平台,并尽量提供章节摘录或文本路径;没有参考也可以直接跳过。
```
可接受的灵感来源:
- 用户自由描述的原创想法;
- 参考作品拆书:书名、平台、章节摘录、完整文本路径;
- 市场趋势或平台风向;
- 题材模板、反套路库、已有脑洞片段。
当用户选择参考作品拆书且提供文本路径或章节摘录时,必须使用 `Agent` 工具调用 `deconstruction-agent`,不得由 init 主流程口头替代拆解结果。
```text
Agent(
subagent_type: "deconstruction-agent",
prompt: "reference_title={reference_title}; reference_source={reference_source}; reference_text_path={reference_text_path}; reference_text_excerpt={reference_text_excerpt}; analysis_mode={quick|deep|auto}; init_goal={当前初始化故事方向或空}; target_genre={题材或空}。只返回 init_reference_research JSON 对象,不写任何文件,不创建目录,不写 .story-system、.webnovel、设定集、大纲、正文、idea_bank.json、state.json 或任何 canon/read model 文件。"
)
```
处理规则:
- 如果用户只有书名/平台,没有文本或摘录,先询问是否能提供摘录/路径;若不能提供,则把参考书仅作为"方向线索",不得编造该书黄金三章、角色、设定或剧情事实。
- 接收返回的 `init_reference_research` JSON 后,只使用其中的 `reader_promise`、`opening_hook_patterns`、`cool_point_loops`、`protagonist_patterns`、`antagonist_pressure_patterns`、`pacing_notes`、`borrowable_structures`、`differentiation_requirements`、`init_candidates`、`quality`。
- 先检查 `quality`:`quality.passed=false`、`confidence < 0.85` 或 `warnings` 非空时,不得把候选折叠进创意约束包;只能把风险和需补充材料展示给用户确认。
- `do_not_copy` 和 `canon_contamination_warnings` 必须进入已知信息清单,作为后续创意生成红线。
- Step 2-6 只能使用用户确认过、并已变形为本书差异化表达的模式。
- 禁止把参考书角色、设定、组织、地点、金手指、剧情事实原样写入生成项目文件。
### Step 2:故事核与商业定位
收集项(必收):
- 书名(可先给工作名)
- 题材(支持 A+B 复合题材)
- 目标规模(总字数或总章数)
- 一句话故事
- 核心冲突
- 目标读者/平台
题材集合(用于归一化与映射):
- 玄幻修仙类:修仙 | 系统流 | 高武 | 西幻 | 无限流 | 末世 | 科幻
- 都市现代类:都市异能 | 都市日常 | 都市脑洞 | 现实题材 | 黑暗题材 | 电竞 | 直播文
- 言情类:古言 | 宫斗宅斗 | 青春甜宠 | 豪门总裁 | 职场婚恋 | 民国言情 | 幻想言情 | 现言脑洞 | 女频悬疑 | 狗血言情 | 替身文 | 多子多福 | 种田 | 年代
- 特殊题材:规则怪谈 | 悬疑脑洞 | 悬疑灵异 | 历史古代 | 历史脑洞 | 游戏体育 | 抗战谍战 | 知乎短篇 | 克苏鲁
交互方式:
- 优先让用户自由描述,再二次结构化确认。
- 若用户卡住,给 2-4 个候选方向供选。
### Step 3:角色骨架与关系冲突
收集项(必收):
- 主角姓名
- 主角欲望(想要什么)
- 主角缺陷(会害他付代价的缺陷)
- 主角结构(单主角/多主角)
- 感情线配置(无/单女主/多女主)
- 反派分层(小/中/大)与镜像对抗一句话
收集项(可选):
- 主角原型标签(成长型/复仇型/天才流等)
- 多主角分工
### Step 4:金手指与兑现机制
收集项(必收):
- 金手指类型(可为"无金手指")
- 名称/系统名(无则留空)
- 风格(硬核/诙谐/黑暗/克制等)
- 可见度(谁知道)
- 不可逆代价(必须有代价或明确"无+理由")
- 成长节奏(慢热/中速/快节奏)
收集项(条件必收):
- 若为系统流:系统性格、升级节奏
- 若为重生:重生时间点、记忆完整度
- 若为传承/器灵:辅助边界与出手限制
### Step 5:世界观与力量规则
收集项(必收):
- 世界规模(单城/多域/大陆/多界)
- 力量体系类型
- 势力格局
- 社会阶层与资源分配
收集项(题材相关):
- 货币体系与兑换规则
- 宗门/组织层级
- 境界链与小境界
### Step 6:创意约束包(差异化核心)
流程:
1. 汇总 Step 1.5 已确认的灵感来源:原创想法、参考拆书结果、市场趋势、题材模板或反套路库。
2. 基于题材映射加载反套路库(最多 2 个主相关库)。
3. 生成 2-3 套创意包,每套包含:
- 一句话卖点
- 反套路规则 1 条
- 硬约束 2-3 条
- 主角缺陷驱动一句话
- 反派镜像一句话
- 开篇钩子
4. 三问筛选:
- 为什么这题材必须这么写?
- 换成常规主角会不会塌?
- 卖点能否一句话讲清且不撞模板?
5. 展示五维评分(详见 `references/creativity/creativity-constraints.md` 的 `8.1 五维评分`),辅助用户决策。
6. 用户选择最终方案,或拒绝并给出原因。
备注:
- 若用户要求"贴近当下市场",可触发外部检索并标注时间戳。
- 若使用了参考拆解,展示候选时必须标明参考来源、转换方式、不可复制项和差异化要求;用户未明确确认前,不写入 `idea_bank.json` 或任何生成项目文件。
### Step 7:一致性复述与最终确认
必须输出"初始化摘要草案"并让用户确认:
- 故事核(题材/一句话故事/核心冲突)
- 主角核(欲望/缺陷)
- 金手指核(能力与代价)
- 世界核(规模/力量/势力)
- 创意约束核(反套路 + 硬约束)
确认规则:
- 用户未明确确认,不执行生成。
- 若用户仅改局部,回到对应 Step 最小重采集。
## 内部数据模型(初始化收集对象)
完整 JSON schema 和字段说明见 `references/init-collection-schema.md`。
顶层字段:`project`(项目信息)、`protagonist`(主角)、`relationship`(关系与反派)、`golden_finger`(金手指)、`world`(世界观)、`constraints`(创意约束)。
## 充分性闸门(必须通过)
未满足以下条件前,禁止执行 `init_project.py`:
1. 书名、题材(可复合)已确定。
2. 目标规模可计算(字数或章数至少一个)。
3. 一句话故事(one_liner)已确定。
4. 核心冲突(core_conflict)已确定。
5. 主角姓名 + 欲望 + 缺陷完整。
6. 世界规模 + 力量体系类型完整。
7. 金手指类型已确定(允许"无金手指")。
8. 创意约束已确定:
- 反套路规则 1 条
- 硬约束至少 2 条
- 或用户明确拒绝并记录原因。
## 项目目录安全规则(必须)
- `project_root` 必须由书名安全化生成(去非法字符,空格转 `-`)。
- 构造公式:`project_root = <当前工作目录>/<书名安全化结果>`,即 `PROJECT_ROOT="${WORKSPACE_ROOT}/${PROJECT_SLUG}"`。
- 若安全化结果为空或以 `.` 开头,自动前缀 `proj-`。
- 禁止在 `.opencode/` 目录下生成项目文件。
- 禁止直接把 `WORKSPACE_ROOT` 当作 `PROJECT_ROOT`,除非用户明确指定当前目录本身就是书项目根。
- 初始化前必须展示并确认:
- `WORKSPACE_ROOT`
- `PROJECT_SLUG`
- `PROJECT_ROOT`
推荐安全化命令(与规则保持一致):
```bash
PROJECT_SLUG="$(python -X utf8 -c "import re,sys; title=sys.argv[1].strip(); slug=re.sub(r'[\\\\/:*?\"<>|]+','',title); slug=re.sub(r'\\s+','-',slug).strip('-'); print(('proj-' + slug) if (not slug or slug.startswith('.')) else slug)" "{title}")"
PROJECT_ROOT="${WORKSPACE_ROOT}/${PROJECT_SLUG}"
echo "WORKSPACE_ROOT=${WORKSPACE_ROOT}"
echo "PROJECT_SLUG=${PROJECT_SLUG}"
echo "PROJECT_ROOT=${PROJECT_ROOT}"
```
## 执行生成
### 1) 运行初始化脚本
```bash
python "${SCRIPTS_DIR}/webnovel.py" init "${PROJECT_ROOT}" "{title}" "{genre}" \
--protagonist-name "{protagonist_name}" --target-words {target_words} --target-chapters {target_chapters} \
--golden-finger-name "{gf_name}" --golden-finger-type "{gf_type}" --golden-finger-style "{gf_style}" \
--core-selling-points "{core_points}" --protagonist-structure "{protagonist_structure}" \
--heroine-config "{heroine_config}" --heroine-names "{heroine_names}" --heroine-role "{heroine_role}" \
--co-protagonists "{co_protagonists}" --co-protagonist-roles "{co_protagonist_roles}" \
--antagonist-tiers "{antagonist_tiers}" --world-scale "{world_scale}" --factions "{factions}" \
--power-system-type "{power_system_type}" --social-class "{social_class}" \
--resource-distribution "{resource_distribution}" --gf-visibility "{gf_visibility}" \
--gf-irreversible-cost "{gf_irreversible_cost}" --currency-system "{currency_system}" \
--currency-exchange "{currency_exchange}" --sect-hierarchy "{sect_hierarchy}" \
--cultivation-chain "{cultivation_chain}" --cultivation-subtiers "{cultivation_subtiers}" \
--protagonist-desire "{protagonist_desire}" --protagonist-flaw "{protagonist_flaw}" \
--protagonist-archetype "{protagonist_archetype}" --antagonist-level "{antagonist_level}" \
--one-liner "{one_liner}" --core-conflict "{core_conflict}" \
--target-reader "{target_reader}" --platform "{platform}"
```
### 2) 写入 `idea_bank.json`
写入 `.webnovel/idea_bank.json`:
```json
{
"selected_idea": {
"title": "",
"one_liner": "",
"anti_trope": "",
"hard_constraints": []
},
"constraints_inherited": {
"anti_trope": "",
"hard_constraints": [],
"protagonist_flaw": "",
"antagonist_mirror": "",
"opening_hook": ""
}
}
```
### 3) Patch 总纲
必须补齐:
- 故事一句话
- 核心主线 / 核心暗线
- 创意约束(反套路、硬约束、主角缺陷、反派镜像)
- 反派分层
- 关键爽点里程碑(2-3 条)
### 4) 生成写前合同树(Story System 初始化)
init 完成后,立即生成 MASTER_SETTING,让后续 plan 有调性/禁忌参照:
```bash
View on GitHubThis SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub