|
|
6 ماه پیش | |
|---|---|---|
| docs | 6 ماه پیش | |
| electron | 6 ماه پیش | |
| electron-dist | 6 ماه پیش | |
| example | 6 ماه پیش | |
| public | 6 ماه پیش | |
| scripts | 6 ماه پیش | |
| src | 6 ماه پیش | |
| .gitignore | 6 ماه پیش | |
| .yarnrc.yml | 6 ماه پیش | |
| LICENSE | 6 ماه پیش | |
| README.md | 6 ماه پیش | |
| cherry-node.json | 6 ماه پیش | |
| electron-builder.yml | 6 ماه پیش | |
| eslint.config.mjs | 6 ماه پیش | |
| next.config.mjs | 6 ماه پیش | |
| package.json | 6 ماه پیش | |
| postcss.config.mjs | 6 ماه پیش | |
| tailwind.config.js | 6 ماه پیش | |
| tailwind.config.mjs | 6 ماه پیش | |
| tsconfig.electron.json | 6 ماه پیش | |
| tsconfig.json | 6 ماه پیش | |
| vitest.config.ts | 6 ماه پیش | |
| yarn.lock | 6 ماه پیش | |
| 启动应用.bat | 6 ماه پیش | |
| 启动应用.sh | 6 ماه پیش | |
| 打包.bat | 6 ماه پیش | |
| 打包.sh | 6 ماه پیش |
面向中文长篇小说的 AI 创作桌面应用(Electron + Next.js)。
Next.js 15 (App Router) + React 19 + TypeScript + Tailwind CSS 4 + Electron 36 + Yarn 4
yarn dev # Web 开发模式 (端口 3000)
yarn electron:dev # Electron 开发模式
yarn build # Next.js 构建
yarn electron:build # Electron 打包
打包.bat # 一键打包脚本
创作流程分为四个阶段(Phase 0-3),每个阶段对应独立的 UI 和 API。
用户通过 AI 引导式面试完成项目初始化。InitWizard 提供分步表单或 AI 对话模式:
初始化完成后自动写入标准文档集:project-overview.md、theme-and-proposition.md、cast-bible.md、writing_style.md、iron-rules.md、writing_style.md(风格锚定部分),以及 world_state/ 和 event-graph/ 初始文件。
创作者在写作前构建完整的世界框架:
world_state/(7 个标准世界状态文件)和 world_state/lore/(世界观设定)。支持自动保存(1.5s 防抖),切换文件时强制保存当前编辑内容。8 步管线(状态自动保存到 sessionStorage,防刷新丢失):
| 步骤 | 组件 | 功能 |
|---|---|---|
| 0 | Step0ControlCard | AI 生成/手动填写控制卡:本章改变什么、推进哪条线、回归什么债务、核心冲突、结尾余波、候选标题 |
| 1 | Step1PlotSelection | AI 生成 5 个剧情选项,或手动输入 |
| 2 | Step2EmbedHooks | AI 生成叙事钩子 + 手动添加 |
| 3 | Step3ResolveHooks | 选择要回收的历史钩子 |
| 4 | Step4ContentEditor | 流式 AI 生成 + 编辑 + 润色 + 去AI味(三步修订:去模板化、去专业腔、恢复真实语感)。自动注入 writing_style.md 和 writing_style.md |
| 5 | Step5ReviewSubmit | 审查 AI 更新的世界状态文件 + 章节标题确认 + 保存 |
| 6 | Step6ContinuityCheck | 8 项连续性审计(设定漂移/人物失真/关系断档/伏笔遗失/支线冷落/情绪债务/AI模式化/段落漂移) |
| 7 | Step7ReaderFeedback | 模拟读者反馈评分(每 5 章自动触发,可覆盖) |
三层质量保障体系:
reader-feedback/route.ts,评分维度:节奏感、爽点密度、情感共鸣、阅读困惑audit/route.ts,检查维度:角色漂移、设定漂移、风格漂移、伏笔缺口滚动摘要系统 — 每章完成后更新 world_state/rolling-summaries/,为后续章节提供上下文压缩,解决长篇小说上下文窗口限制。
反漂移系统:
长篇创作进入稳态后的维护界面,提供:
级联检查系统 (cascade-check/route.ts):
action: "rewrite" — 检测重写章节影响到的后续章节(通过事件图谱的父子依赖)action: "setting_change" — 检测世界设定变更与已有章节的冲突勾选后每章保存完成自动延迟 1 秒打开下一章管线,可随时取消。
src/app/
├── page.tsx # 首页(通用写作助手 WritingAssistant)
├── layout.tsx # 根布局
├── globals.css # 全局样式
├── error.tsx / global-error.tsx # 错误边界
├── not-found.tsx # 404
├── components/ # 通用组件
│ ├── WritingAssistant.tsx # 通用 AI 编辑器
│ ├── Navigation.tsx # 导航栏 [写作助手, 小说创作]
│ ├── FeatureLayout.tsx # 功能页布局壳
│ ├── ApiSettings.tsx # API 配置(Provider/URL/Key/Model)
│ ├── AiGuideChat.tsx # AI 引导对话
│ ├── PromptForm.tsx # 提示词表单
│ ├── StreamingContent.tsx # 流式内容展示
│ ├── ResumePreview.tsx # 简历预览
│ ├── Footer.tsx # 页脚
│ ├── editor/
│ │ ├── NovelEditor.tsx # 通用 AI 编辑器
│ │ └── utils/streamToEditor.ts # SSE 流接入编辑器
│ ├── sidebar/
│ │ └── SettingsDrawer.tsx # 设置抽屉
│ └── decorations/ # 装饰组件
├── features/
│ └── novel-writer/ # 【核心】长篇创作系统(Electron 默认入口)
│ ├── page.tsx # 四阶段入口:项目选择→初始化→创作→维护
│ └── components/
│ ├── ProjectManager.tsx # 项目 CRUD(Electron 文件夹选择器)
│ ├── InitWizard.tsx # Phase 0: 5步/对话式初始化向导
│ ├── NovelContextManager.tsx # Phase 2: 主创作界面+管线编排
│ ├── PhaseNavigation.tsx # Phase 1-3 阶段切换
│ ├── WorldEditor.tsx # Phase 1: 世界状态文件编辑器
│ ├── EventGraphEditor.tsx # Phase 1: 事件图谱编辑器
│ ├── WorldStateSidebar.tsx # 世界状态侧边栏
│ ├── ChapterDraftPipeline.tsx # 8步章节管线编排
│ ├── ChapterHistoryList.tsx # 章节历史列表
│ ├── WritingConstraintManager.tsx # 写作约束管理
│ ├── AntiHomogenizationPanel.tsx # 反同质化策略面板
│ ├── MaintenancePanel.tsx # Phase 3: 维护面板
│ └── pipeline/
│ ├── Step0ControlCard.tsx # 控制卡
│ ├── Step1PlotSelection.tsx # 剧情选择
│ ├── Step2EmbedHooks.tsx # 埋入叙事钩子
│ ├── Step3ResolveHooks.tsx # 解决历史钩子
│ ├── Step4ContentEditor.tsx # 内容生成+润色+去AI味
│ ├── Step5ReviewSubmit.tsx # 审核+保存
│ ├── Step6ContinuityCheck.tsx # 连续性检查
│ └── Step7ReaderFeedback.tsx # 读者反馈
├── hooks/
│ ├── useNovelProject.ts # 项目生命周期管理
│ ├── useWorldState.ts # 世界状态文件读写
│ ├── useChapterHistory.ts # 章节历史管理
│ ├── useStateUpdater.ts # AI 更新世界状态
│ ├── useEditorAI.ts # 通用编辑器 AI
│ └── useContextInjector.ts # 上下文注入(iron-rules + style-anchor)
├── lib/
│ ├── novel-types.ts # 核心类型定义
│ ├── novel-utils.ts # 文件名/模板/钩子工具
│ ├── novel-server-utils.ts # 服务端工具(isPathSafe/isValidProject)
│ ├── style-modules.ts # 7种风格模块 Prompt
│ ├── chapter-prompts.ts # 控制卡/连续性检查/去AI味/读者反馈 Prompt 模板
│ ├── event-graph-utils.ts # 事件图谱数据处理工具
│ ├── api.ts / types.ts / editor-types.ts / secureApiKey.ts
│ ├── resumeAiGuide.ts / resumeApi.ts / resumeTypes.ts / resumeTemplates.ts / resumePdfExport.ts
│ └── __tests__/ # 单元测试
│ ├── novel-utils.test.ts / novel-utils-isvalidproject.test.ts
│ ├── context-injector.test.ts / event-graph-utils.test.ts
│ ├── iron-rules.test.ts / resolve-hook.test.ts / state-updater.test.ts
└── api/
├── proxy/route.ts # 非流式 LLM 代理(支持 OpenAI 格式 + Ollama)
├── proxy/ollama-models/route.ts # Ollama 模型列表
├── proxy/cherry-models/route.ts # Cherry Studio 模型列表
├── stream-proxy/route.ts # 流式 SSE 代理
└── novel/
├── project/route.ts # 项目 CRUD
├── files/route.ts # 文件读写(read/write/list/delete/open)
├── init/route.ts # 项目初始化(写入标准文档)
├── select-folder/route.ts # Electron 文件夹选择器
├── iron-rules/route.ts # iron-rules.md 读写
├── style-anchor/route.ts # writing_style.md(风格锚定部分) 读写
├── summarize/route.ts # 滚动摘要生成
├── audit/route.ts # 里程碑审计(每20章)
├── reader-feedback/route.ts # 模拟读者反馈(每5章)
├── cascade-check/route.ts # 级联影响分析(重写/设定变更)
├── event-graph/route.ts # 事件图谱 CRUD
│ ├── allocate/route.ts # AI 事件-章节分配
│ └── validate/route.ts # 事件图谱验证
└── __tests__/
├── files.test.ts
└── init.test.ts
electron/
├── main.ts # Electron 主进程(加载 /features/novel-writer)
└── preload.ts # 暴露 electronAPI(selectFolder/getAppConfig/saveAppConfig)
{项目文件夹}/
├── novel_project.json # 项目配置
├── project-overview.md # 项目总览
├── theme-and-proposition.md # 主题命题
├── cast-bible.md # 人物圣经
├── writing_style.md # 风格指南(7种模块)
├── iron-rules.md # 项目铁律(反漂移)
├── writing_style.md(风格锚定部分) # 风格锚定摘要(反漂移)
├── world_state/ # 世界状态文件(7个标准文件)
│ ├── 02-core-world-rules.md
│ ├── 04-world-physics.md
│ ├── 05-factions.md
│ ├── 06-map-and-geography.md
│ ├── 07-history-and-events.md
│ ├── 08-magic-and-power-system.md
│ ├── 10-main-plot-outline.md
│ ├── lore/ # 世界观设定
│ └── rolling-summaries/ # 滚动摘要(每章追加)
├── chapters/ # 正文章节
├── control-cards/ # 章节控制卡
├── event-graph/ # 事件图谱
│ ├── events.json # 事件节点
│ ├── edges.json # 事件间关系
│ └── chapter-allocation.json # 事件-章节分配
├── logs/ # 审计日志
│ ├── audit/ # 里程碑审计记录
│ └── reader-feedback/ # 读者反馈记录
└── history/ # 历史版本
每个模块包含核心技法 Prompt,在 InitWizard 选择后写入 writing_style.md,Step4 生成时自动注入:
| 模块 | 核心原则 |
|---|---|
| 幽默 | 角色驱动、callback回响、信息差制造笑点 |
| 悬念 | 信息差制造预测压力、倒计时、必须兑现 |
| 推理 | 线索公平性、多层误导、揭示阶梯 |
| 爱情 | 情感债务引擎、亚文本、障碍来自角色内部 |
| 恐怖 | 有限POV、日常异化、恐惧等级递增 |
| 奇幻 | 规则代价、日常厚度、规则一致性 |
| 文学 | 语言节制、主题通过选择戏剧化、意象系统一致性 |
OpenAI / Grok (xAI) / DeepSeek / Ollama (本地) / Cherry Studio / 自定义 API。 API Key 不经过服务器存储,所有调用通过 Next.js API Route 代理转发。 Ollama 响应保留原始 Markdown 格式,不做去标记处理。
isPathSafe() 防路径遍历(../ ..\\ %2e%2e 空字节)spawn() 防命令注入response.ok 和 data.error^