/** * opencode-novel-plugin - Document Templates * * 各阶段文档的初始模板,用于 novel_init 创建项目结构 * 参考 novel-workflow-mcp 的模板系统设计 */ // ============================================================ // 故事概念模板 // ============================================================ export const CONCEPT_TEMPLATE = `# 《{title}》故事概念 ## 一句话概括 > [请填写:类型]故事:[主角]在[背景]中,必须[核心任务],否则[代价]。 ## 五句话梗概 1. [常态世界与主角介绍] 2. [触发事件,打破常态] 3. [第一次两难抉择与上升行动] 4. [危机深化与黑暗时刻] 5. [最终对决与结局] ## 核心冲突 ### 外部冲突 [描述主角面对的外部挑战] ### 内部冲突 [描述主角内心的矛盾与挣扎] ## 道德前提 [故事要传达的深层主题/真理] ## 两次两难抉择 ### 第一次两难(约50%处) [描述:两个都有代价的选择] ### 第二次两难(约75%处) [描述:更深层的价值观冲突] ## 故事基调与风格 - 整体基调:[轻松/紧张/沉重/幽默] - 叙事风格:[写实/浪漫/黑暗/史诗] - 目标读者:[群体描述] ## 基本信息 - 类型:{genre} - 预计字数:{targetWords}字 - 预计章节:{chapterCount}章 - 叙事视角:[第一人称/第三人称有限/第三人称全知] ` // ============================================================ // 世界观模板 // ============================================================ export const WORLD_BUILDING_TEMPLATE = `# 《{title}》世界观设定 ## 时代背景 [描述故事发生的时间与社会状态] ## 地理环境 ### 主要地点 - **[地点1名]**:[描述、特征、在故事中的作用] - **[地点2名]**:[描述、特征、在故事中的作用] - **[地点3名]**:[描述、特征、在故事中的作用] ### 地理特征 [整体地理格局与对故事的影响] ## 社会结构 ### 权力体系 [统治方式、权力机构、权力更迭规则] ### 社会阶层 [各阶层描述、阶层流动的可能性] ### 主要势力 | 势力名称 | 目标/特征 | 与主角关系 | |---------|----------|-----------| | [势力1] | [描述] | [关系] | | [势力2] | [描述] | [关系] | ## 力量体系(如适用) ### 基本规则 [特殊能力的运作规则] ### 限制与代价 [使用力量的限制和代价] ### 等级划分(如适用) [力量等级与区别] ## 文化风俗 ### 语言与文字 [语言特点] ### 宗教与信仰 [信仰体系] ### 重要节日与禁忌 [节日/禁忌描述] ## 经济与科技 [经济形态与科技水平] ## 世界规则 1. [规则1:描述] 2. [规则2:描述] 3. [规则3:描述] ## 世界冲突 [世界中存在的固有矛盾,为故事提供土壤] ` // ============================================================ // 角色档案模板 // ============================================================ export const CHARACTER_PROFILES_TEMPLATE = `# 《{title}》角色总览 > 每个角色的完整档案请查看独立文件 \\\`characters/{角色名}.md\\\` > 此文件只保留角色清单、关系图谱和冲突矩阵。 ## 角色清单 | 角色名 | 角色定位 | 核心矛盾 | 状态 | |--------|---------|---------|------| | [主角姓名] | 主角 | [与对手的根本冲突] | 活跃 | | [对手姓名] | 对手 | [与主角的根本冲突] | 活跃 | | [配角1] | [身份/关系] | [核心冲突] | 活跃 | ## 人物关系图谱 \\\`\\\`\\\` [主角] <──冲突──> [对手] | | ├──盟友──> [配角1] ──对立──> [对手] | └──暧昧──> [配角2] ──关联──> [对手阵营] \\\`\\\`\\\` ## 角色关系冲突矩阵 | 角色 | 主角 | 对手 | 配角1 | 配角2 | |------|------|------|-------|-------| | 主角 | — | | | | | 对手 | | — | | | | 配角1 | | | — | | | 配角2 | | | | — | ` /** 单个角色档案模板,用于 characters/{角色名}.md */ export const CHARACTER_PROFILE_TEMPLATE = `# {角色名} ## 基本信息 - **姓名**: - **年龄**: - **性别**: - **外貌特征**:[含标志性特征,如疤痕、习惯性表情等] - **社会身份**:[职业/地位] - **背景故事**:[成长经历的关键要素] ## 驱动力三角 - **外在目标**:[角色想要什么 — 具体的、可衡量的] - **内在需求**:[角色真正需要什么 — 深层的、通常角色自己不清楚] - **核心缺陷**:[阻碍角色成长的核心弱点 — 源于过去的经历] ## 性格特征 - **核心性格**:[3-5个关键词,如:倔强、善良、敏感、爱面子] - **语言习惯**:[口头禅、说话节奏、常用语气词] - **行为习惯**:[紧张时的小动作、开心时的表现] ## 人物弧线 | 阶段 | 心理状态 | 关键事件 | 成长标志 | |------|---------|---------|---------| | 起点 | [初始信念/状态] | [触发事件] | — | | 发展 | [开始动摇/改变] | [关键转折] | [小的改变] | | 低谷 | [最黑暗的状态] | [最深层冲突] | [被打碎] | | 成长 | [新的认知] | [领悟时刻] | [质的飞跃] | | 终点 | [全新的状态] | [最终抉择] | [完成弧线] | ## 章节状态追踪 > 每次出场后由 novel-editor 更新 | 章节 | 事件 | 状态变化 | 关系变化 | |------|------|---------|---------| | 第1章 | [事件摘要] | [状态] | [关系] | ` // ============================================================ // 简要大纲模板 // ============================================================ export const OUTLINE_DETAILED_TEMPLATE = `# 《{title}》详细大纲 > 此文档在简要大纲基础上扩展为逐章详细规划。 ## 第1章:[标题占位] **定位**:开端/常态展示 **情感基调**:待定 **悬念密度**:渐进 **认知颠覆**:★☆☆☆☆ ### 核心情节 [200-300字描述本章主要事件] ### 涉及角色 - [角色A]:[本章中的角色状态变化] - [角色B]:[本章中的角色状态变化] ### 伏笔操作 - 🌱 埋设:[新伏笔描述] - 🔗 强化:[已有伏笔的推进] - ✅ 回收:[回收之前的伏笔] ### 关键场景提示 - 场景1:[场景描述](主动:目标/冲突/挫折) - 场景2:[场景描述](被动:反应/困境/决定) ### 章节结尾钩子 [确保读者想继续读下去的结尾设计] --- > 请按照上述格式,为每一章创建详细的规划条目。 > 从简要大纲中提取每章的核心内容,扩展为完整描述。 ` export const OUTLINE_BRIEF_TEMPLATE = `# 《{title}》简要大纲 ## 基本信息 - **总字数目标**:{targetWords}字 - **总章节数**:{chapterCount}章 - **类型**:{genre} ## 一句话概括 > [从概念文档复述] ## 三幕结构概览 ### 第一幕:开端(约25%,第1-{act1End}章) **核心任务**:建立常态世界 → 打破它 → 迫使主角行动 1. **常态展示**(第1-2章) - [展示主角的日常生活和内在缺陷] - [建立世界观基本规则] 2. **触发事件**(第{triggerChapter}章) - [打破主角日常的事件] 3. **犹豫与决断**(第{thresholdChapter}章) - [主角面对选择:拒绝还是接受] **第一幕结尾转折**:[主角跨越门槛,无法回头] --- ### 第二幕前半:上升(约25%,第{act2aStart}-{act2aEnd}章) **核心任务**:新世界探索 → 测试与成长 → 中点转折 1. **新世界/对抗开始** - [主角面对的第一个真正挑战] 2. **盟友与敌人** - [结识关键伙伴,识别威胁] 3. **中点转折**(第{midpointChapter}章) - [重大认知转变或情境突变] **中点转折**:[从被动应对转向主动出击] --- ### 第二幕后半:危机(约25%,第{act2bStart}-{act2bEnd}章) **核心任务**:敌人逼近 → 第一次两难 → 黑暗时刻 1. **敌人逼近** - [对手/威胁步步紧逼] 2. ⚡ **第一次两难抉择**(第{dilemma1Chapter}章) - [两个都有代价的选择] - [选择:描述主角的选择和代价] 3. **黑暗时刻**(第{darkChapter}章) - [主角的最低点,看似一切尽失] **黑暗时刻**:[描述主角失去什么] --- ### 第三幕:高潮与结局(约25%,第{act3Start}-{act3End}章) **核心任务**:顿悟 → 第二次两难 → 最终对决 → 新平衡 1. **顿悟与重整** - [主角从低谷中获得新的认知] 2. ⚡ **第二次两难抉择**(第{dilemma2Chapter}章) - [更深层的价值观冲突] 3. **最终对决**(第{climaxChapter}章) - [主角运用成长后的力量面对最终挑战] 4. **新的平衡**(第{resolutionChapter}章) - [结局展示主角如何改变] ## 伏笔规划表 | 编号 | 伏笔描述 | 埋设章节 | 回收章节 | 重要程度 | |------|---------|---------|---------|---------| | F1 | | 第X章 | 第Y章 | 高/中/低 | | F2 | | | | | ` // ============================================================ // 场景列表模板 // ============================================================ export const SCENES_TEMPLATE = `# 《{title}》场景列表 ## 场景统计 - **总场景数**:{totalScenes} - **主动场景**:{activeScenes} | **被动场景**:{passiveScenes} - **预计总字数**:{targetWords}字 > **说明**: > - 主动场景结构:目标(Goal) → 冲突(Conflict) → 挫折(Disaster) > - 被动场景结构:反应(Reaction) → 困境(Dilemma) → 决定(Decision) > - 状态标记:\`[ ]\` 待写 | \`[-]\` 进行中 | \`[x]\` 完成 --- ## 第一幕:开端 ### 1.1 [场景标题] - [ ] **状态**:待写 - **类型**:主动 - **视点人物**:[角色名] - **目标**:[场景目标] - **冲突**:[面临的阻碍] - **挫折**:[场景结果/意外] - **字数建议**:约X字 - **_Prompt**:Role: 小说家 | Task: [核心任务] | Character: [角色特征] | Emotion: [情感曲线] | Sensory: [感官重点] | Pacing: [节奏] | Avoid: ❌[避免] | Restrictions: [限制] | Success: [成功标准] ### 1.2 [场景标题] - [ ] **状态**:待写 - **类型**:被动 - **视点人物**:[角色名] - **反应**:[对上一场景的情绪反应] - **困境**:[内心抉择] - **决定**:[做出的决定] - **字数建议**:约X字 - **_Prompt**:Role: 小说家 | Task: [核心任务] | Character: [角色特征] | Emotion: [情感曲线] | Sensory: [感官重点] | Pacing: [节奏] | Avoid: ❌[避免] | Restrictions: [限制] | Success: [成功标准] --- [继续所有场景...] ` // ============================================================ // 全局摘要初始模板 // ============================================================ export const SUMMARY_TEMPLATE = `# 《{title}》前文摘要 > 随着章节推进,此文档将不断更新,保持2000字以内的完整摘要。 > 每完成一章后自动更新。 ## 故事进展 [等待第一章完成后更新] ## 关键角色状态 [等待角色出场后更新] ## 未解决伏笔 [等待伏笔埋设后更新] ` // ============================================================ // 伏笔追踪初始模板(JSON) // ============================================================ export const FORESHADOW_TEMPLATE = { items: [] as Array<{ id: string title: string content: string category: string status: string plantChapter: number | null targetChapter: number | null resolvedChapter: number | null notes: string }>, } // ============================================================ // 角色状态初始模板(JSON) // ============================================================ export const CHARACTER_STATE_TEMPLATE = { characters: [] as Array<{ name: string status: string role: string physicalState: string mentalState: string items: string[] abilities: string[] relationships: Record events: string[] lastUpdatedChapter: number | null }>, } // ============================================================ // 项目配置模板 // ============================================================ export const CONFIG_TEMPLATE = { title: "{title}", genre: "{genre}", theme: "", targetWords: 200000, chapterCount: 50, narrativePerspective: "第三人称有限", createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), currentPhase: "concept" as string, } // ============================================================ // 武侠专属模板 // ============================================================ export const WUXIA_SECTS_TEMPLATE = `# 《{title}》门派势力 ## 正派 ### [门派名称] - **定位**: 剑修名门 / 佛门正派 / 道家正统 / ... - **所在地**: [地理位置] - **掌门**: [掌门名称及特征] - **核心武功**: [镇派之宝] - **门规**: [3-5条核心规矩] - **弟子层级**: 外门弟子 → 内门弟子 → 核心弟子 → 长老 → 掌门 - **与其他门派关系**: [关系描述] - **核心理念**: [门派信仰/追求] ## 邪派 [同上结构] ## 中立势力 [同上结构] ## 隐世门派 [同上结构] ## 势力版图 \`\`\` [描述各门派的地域分布和势力范围] \`\`\` ` export const WUXIA_MARTIAL_ARTS_TEMPLATE = `# 《{title}》功法谱 ## 内功心法 ### [功法名称] - **层次**: 入门 → 小成 → 大成 → 圆满 → 化境 - **特征**: [每层特征描述] - **修炼条件**: [条件] - **代价/限制**: [代价] - **克制关系**: [克制/被克制] ## 外功招式 ### [招式名称] - **类别**: [拳/掌/指/腿/剑/刀] - **口诀**: [口诀] - **特点**: [特点] - **破绽**: [破绽] ## 轻功身法 [同上结构] ## 特殊功法 [同上结构] ` export const WUXIA_WEAPONS_TEMPLATE = `# 《{title}》兵器谱 ## 剑 ### [兵器名称] - **持有者**: [角色名] - **来历**: [兵器来历故事] - **特点**: [兵器特色] - **特殊能力**: [如有] ## 刀 [同上结构] ## 枪 [同上结构] ## 暗器 [同上结构] ` // ============================================================ // 现实映射素材模板 // ============================================================ export const REALITY_SOURCE_TEMPLATE = `# 《{title}》现实映射素材库 ## 素材记录 ### 素材1: [素材标题] - **来源**: [新闻/历史/观察/其他] - **核心冲突**: [一句话概括] - **涉及的社会议题**: [议题] - **可用程度**: [可直接改编/需要大量陌生化/仅作灵感参考] #### 原型提取 - **角色原型**: [从素材中提取的人物原型] - **性格特征**: [核心特征描述] #### 陌生化方案 [如何将此素材转化为虚构元素] --- ## 映射关系表 | 现实元素 | 虚构映射 | 所在章节 | 处理方式 | |---------|---------|---------|---------| | [元素1] | [虚构对应物] | [章节] | [陌生化手法] | ## 主题清单 1. [主题1]: [这个故事要探讨的社会议题] 2. [主题2]: [更深层的思考方向] ## 法律合规检查 - [ ] 所有人物原型已充分艺术化改造 - [ ] 未使用真实人物姓名+可识别特征 - [ ] 已添加"本故事纯属虚构"声明 - [ ] 涉及敏感话题已做适当处理 ` // ============================================================ // 导出 // ============================================================ export type TemplateName = | "concept" | "world-building" | "characters" | "character-profile" | "outline-brief" | "outline-detailed" | "scenes" | "summary" | "foreshadow" | "character-state" | "config" | "reality-source" | "sect" | "martial-art" | "weapon" export function getTemplate(name: TemplateName): string { switch (name) { case "concept": return CONCEPT_TEMPLATE case "world-building": return WORLD_BUILDING_TEMPLATE case "characters": return CHARACTER_PROFILES_TEMPLATE case "character-profile": return CHARACTER_PROFILE_TEMPLATE case "outline-brief": return OUTLINE_BRIEF_TEMPLATE case "outline-detailed": return OUTLINE_DETAILED_TEMPLATE case "scenes": return SCENES_TEMPLATE case "summary": return SUMMARY_TEMPLATE case "reality-source": return REALITY_SOURCE_TEMPLATE case "sect": return WUXIA_SECTS_TEMPLATE case "martial-art": return WUXIA_MARTIAL_ARTS_TEMPLATE case "weapon": return WUXIA_WEAPONS_TEMPLATE default: return "" } } export function fillTemplateVars(template: string, vars: Record): string { return template.replace(/\{(\w+)\}/g, (_, key) => String(vars[key] ?? `{${key}}`)) }