清墨是一款专为小说创作者打造的轻量化结构化写作工具。它复刻了VS Code的核心UI体验,剔除冗余功能,专注于小说写作的结构化需求。通过Markdown(内容)+ JSON(设计)为核心载体,支持人设/章节图形化调整,预留LLM辅助拓展能力,全程本地运行,无云端依赖。
- 体验层:100%复用VS Code的核心UI/交互逻辑(左侧工具栏、树形导航、分栏编辑、快捷键),降低用户学习成本。
- 轻量化:安装包体积≤8MB,启动时间≤0.5秒,内存占用≤50MB(无浏览器内核/冗余进程)。
- 结构化:以Markdown+JSON为核心,实现小说内容、人设、章节的结构化管理,适配LLM输入。
- 场景化:提供小说专属的图形化人设/章节调整、大纲/伏笔管理功能,无编程相关冗余模块。
小说创作者(侧重结构化写作、适配LLM辅助创作的用户)。
- 用户侧极致轻量化:仅保留写作核心功能,剔除插件市场、终端、调试、Git、Copilot等所有冗余模块;仅本地纯文本存储(MD/JSON),无数据库/云端同步。
- VS Code UI体验复用:复刻左侧工具栏(图标化切换面板)、树形项目导航、分栏编辑区、快捷键体系(如Ctrl+S保存、Ctrl+/注释)。
- 结构化优先:所有内容最终落地为Markdown/JSON结构化文本,图形化操作仅为交互层,最终同步到文本文件。
- 小说场景专属:功能模块仅围绕“内容写作、人设管理、章节调整、大纲伏笔、LLM辅助”设计,无通用编辑冗余功能。
- 本地优先:所有操作本地完成,无强制联网、数据上传,LLM优先支持本地轻量模型部署。
- UI层:复刻VS Code风格界面,使用egui实现轻量化渲染。
- 交互层:图形化操作(人设卡片、章节时间轴、大纲树等),与文本层双向同步。
- 数据层:纯文本存储(Markdown/JSON),支持本地文件操作。
- 拓展层:LLM辅助接口,支持本地模型部署。
- 项目树形导航:复刻VS Code项目树,仅显示小说项目目录:Content(MD内容文件)、Design(JSON设计文件)、废稿文件夹;支持折叠/展开、重命名、删除。
- 双分栏编辑区:左侧Content栏:Markdown编辑(保留VS Code语法高亮、块折叠、快捷键);右侧Design栏:JSON编辑(自动生成模板,与MD实时联动)。
- 本地文件操作:新建/保存/导出MD/JSON文件,无自动备份、版本历史(避免冗余)。
- 人设图形化编辑器:卡片式布局:人物卡片(显示姓名/核心属性),拖拽卡片绘制关系线(敌对/友好/亲属);编辑卡片属性自动同步到Content/人设.md和Design/人物配置.json。
- 章节时间轴编辑器:横向时间轴:显示章节节点,点击添加/删除章节,拖拽调整顺序;节点可标注“高潮/伏笔/过渡”,同步到Design/章节结构.json。
- 一键同步:将图形化调整结果同步到MD/JSON文件,支持反向同步(修改文本后更新图形化界面)。
- 大纲树形编辑器:复刻VS Code树形折叠逻辑,拖拽调整大纲层级(卷→章→节→核心情节);支持折叠/展开,同步到Content/章节大纲.md。
- 伏笔标签管理:标签式布局:添加伏笔标签(如“伏笔1:XX”),拖拽关联对应章节;支持搜索、筛选,同步到Content/伏笔.md。
- 进度追踪:极简进度显示:仅展示章节完成度(已写/待写),无冗余统计/分析功能。
- 结构化补全:读取Content的Markdown层级,调用LLM补全正文/对话/场景描述;结果直接插入编辑区。
- 人设对话优化:基于图形化人设的属性(性格/背景),优化Content中的人物对话风格。
- 本地模型适配:支持Llama 2 7B、Phi-2等轻量模型本地部署,无强制联网调用云端API。
- 极简配置:仅保留“模型选择、温度调节、补全长度”3个配置项,无冗余参数。
┌─────────────────────────────────────────────────────────────────────────────┐
│ 顶部菜单栏(极简):文件/编辑/视图/设置 │
├────────┬───────────────────────────────────────────────────────────────────┤
│ 左侧工具栏(图标化)│ 左侧面板(随工具栏切换) │ 中央编辑区(双分栏) │
│ 📝(小说编辑) │ ┌──────────────────────────────────────────────────┐ │ ┌──────────────┬──────────────┐ │
│ 👤(人设&章节) │ │ 项目树:Content/Design/废稿 │ │ │ Content(MD)│ Design(JSON)│ │
│ 🧭(大纲&伏笔) │ │ (VS Code树形折叠逻辑) │ │ │ 编辑区 │ 编辑区 │ │
│ 🤖(LLM辅助) │ └──────────────────────────────────────────────────┘ │ └──────────────┴──────────────┘ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 人设卡片+章节时间轴(图形化) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 大纲树+伏笔标签(轻量化可视化) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ LLM辅助配置+功能按钮(极简) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
└────────┴───────────────────────────────────────────────────────────────────┘
- 左侧工具栏:点击图标切换左侧面板,hover显示模块名称(如📝:小说编辑)。
- 项目树:右键菜单仅保留“新建文件/文件夹、重命名、删除、打开”,无VS Code的“在终端中打开、复制路径”等冗余选项。
- 编辑区:复用VS Code快捷键(Ctrl+S保存、Ctrl+/注释、Ctrl+Z撤销、Alt+鼠标选中块);Markdown语法高亮与VS Code一致。
- 图形化操作:拖拽操作后自动提示“是否同步到文本文件”,无自动同步(避免误操作)。
- LLM辅助:点击“补全”按钮后,结果插入编辑区光标位置,保留撤销功能。
- 底层语言&框架:Rust + egui(极致轻量化,打包体积≤5MB,内存占用极低,支持本地LLM部署)。
- 文本解析引擎:tree-sitter(MD/JSON结构化解析,轻量、高性能,支持AST解析,适配小说文本的层级/标签提取)。
- 图形化渲染:egui(轻量化,无冗余动画,内存占用低)。
- 本地存储:纯文本文件(MD/JSON,无数据库依赖,轻量化,用户可直接用其他编辑器打开)。
- LLM接口:llm-rs(支持本地轻量模型部署,适配主流云端API)。
- 编译优化:Rust项目开启release模式,裁剪无用依赖,静态编译。
- 资源裁剪:仅保留核心图标/样式,无图片/字体冗余,复用系统字体。
- 进程管控:仅启动主进程,无后台辅助进程。
- 渲染优化:图形化界面仅渲染当前可视区域,不加载全量数据。
- 安装包体积:≤5MB(Rust+egui方案);剔除所有第三方UI组件冗余、无用依赖。
- 启动速度:≤0.5秒;无启动加载动画,直接渲染界面,延迟加载非核心模块。
- 内存占用:≤50MB(编辑单本10万字小说时);无内存泄漏,关闭面板后释放对应资源。
- 存储占用:仅存储MD/JSON纯文本,无缓存文件/日志文件。
- 运行时冗余:无自动更新、无日志收集、无广告、无弹窗提示(仅必要操作确认)。
| 里程碑 | 状态 | 说明 |
|---|---|---|
| ✅ VS Code 风格 UI 复刻 | 完成 | 左侧工具栏、项目树、双分栏编辑区均已实现 |
| ✅ 本地 MD/JSON 文件操作 | 完成 | 新建/保存/导出/撤销,快捷键 Ctrl+S/Z 已绑定 |
| ✅ Markdown 预览渲染 | 完成 | 支持标题、粗斜体、代码块、列表、引用等语法 |
| ✅ 轻量化基础达标 | 完成 | Rust+egui 方案,打包体积目标 ≤5MB |
| 里程碑 | 状态 | 说明 |
|---|---|---|
| ✅ 世界对象编辑器(卡片视图) | 完成 | 人物/场景/道具等对象支持卡片/列表双视图,可管理关联关系 |
| ✅ 章节结构编辑器(时间轴视图) | 完成 | 支持树形/时间轴双视图,节点标签(高潮/伏笔/过渡)、完成度追踪 |
| ✅ 大纲树与伏笔管理 | 完成 | 层级结构编辑、跨节点关联、伏笔新增/解决/同步到 MD |
| ✅ 图形化操作与 MD/JSON 双向同步 | 完成 | 世界对象/章节结构/伏笔均可一键同步到对应 JSON/MD 文件 |
| ✅ 进度追踪 | 完成 | 叶节点完成度进度条,里程碑管理面板 |
| 里程碑 | 状态 | 说明 |
|---|---|---|
✅ LLM 后端接口抽象(LlmBackend trait) |
完成 | MockBackend(模拟)、ApiBackend(HTTP)已实现,支持 Ollama 和 OpenAI 兼容格式 |
| ✅ 非阻塞异步调用(线程+通道) | 完成 | 后台线程发起请求,UI 轮询结果,附带加载指示器与取消按钮 |
| ✅ 结构化上下文注入 | 完成 | 可一键将世界对象/章节结构注入提示词,实现结构化补全 |
| ✅ 本地轻量模型适配(llama.cpp HTTP 服务器) | 完成 | LocalServerBackend 支持 llama.cpp 原生 /completion 接口,UI 提供启动命令提示 |
| ✅ 人设对话风格优化 | 完成 | 人物选择器 + build_dialogue_optimization_prompt() 自动注入人物特质/背景/关系,一键优化对话 |
| ✅ 提示词快速模板 | 完成 | 内置「续写正文/扩写场景/优化对话/生成人物简介」四种模板,PromptTemplate 可扩展 |
| ✅ 系统提示词支持 | 完成 | LlmConfig.system_prompt 字段,HTTP API 和本地服务器均可配置系统角色 |
| ✅ API + Skill(Agent)架构 | 完成 | Skill trait + 4 内置技能 + SkillSet + AgentBackend(OpenAI 工具调用循环,最多 5 轮),UI 提供 🤖 Agent 模式切换 |
| 里程碑 | 状态 | 说明 |
|---|---|---|
| ✅ 配置持久化 | 完成 | LLM 配置、MD 预览设置自动保存/恢复到 ~/.config/qingmo/config.json,启动时自动加载上次项目 |
| ✅ 反向同步(JSON/MD → 应用状态) | 完成 | 从 Design/世界对象.json、Design/章节结构.json、Content/伏笔.md、Design/里程碑.json 恢复图形化界面数据;工具菜单提供单项加载入口;设置中可开启"打开项目时自动反向同步" |
| ✅ 全文搜索 | 完成 | Ctrl+Shift+F 打开浮动搜索窗口,扫描项目内所有 .md/.json 文件,显示文件名+行号+内容摘要,双击结果跳转到编辑器 |
| ✅ 导出与备份 | 完成 | 文件菜单「导出章节合集」将 Content/*.md 合并导出为单一 Markdown 文件;「备份项目到文件夹」将整个项目目录递归复制到用户指定位置 |
| ✅ 拖拽重排 | 完成 | 世界对象列表视图支持拖拽排序(egui dnd_drag_source / dnd_release_payload);章节结构顶层节点支持拖拽重排,选中状态随位置正确更新 |
| ✅ Markdown 编辑增强 | 完成 | 左侧 Markdown 编辑器实时显示非空白字符数(文字数);Ctrl+B 加粗(选中文字自动包裹 **,未选中时插入 **粗体** 模板);Ctrl+I 斜体(同上逻辑) |
| 里程碑 | 优先级 | 说明 |
|---|---|---|
| ⏳ 自动保存 | 🔴 高 | 定时(如每 60 秒)自动将已修改的文件保存到磁盘,防止意外关闭导致数据丢失;状态栏显示"上次自动保存时间" |
| ⏳ 文件树重命名与删除 | 🔴 高 | 右键菜单补齐重命名(F2 快捷键)和删除(移入废稿文件夹)两项基础操作;删除前弹出确认对话框 |
| ⏳ 亮色/暗色主题切换 | 🟡 中 | 在设置窗口提供主题选择(跟随系统 / 亮色 / 暗色),通过 egui::Visuals 动态切换,配置写入 AppConfig 持久化 |
| ⏳ 编辑器字体大小配置 | 🟡 中 | 在设置中为编辑器(Monospace 字体族)独立设置字号,与预览字号互相独立,Ctrl+滚轮快速缩放 |
| ⏳ 关系图谱可视化 | 🟡 中 | 在「世界对象」面板增加「图谱」视图:以节点图展示对象及其关联关系(egui 自定义绘图),支持拖拽布局,不依赖第三方图形库 |
| ⏳ PDF/纯文本导出 | 🟢 低 | 在「导出章节合集」基础上增加纯文本(.txt)导出选项;调用系统打印对话框输出 PDF(跨平台方式:依赖 OS 打印管道) |
| ⏳ 新项目模板 | 🟢 低 | 提供「空白项目」「短篇小说」「长篇小说(卷→章→节)」三类模板;选择后自动生成目录结构和初始 MD/JSON 文件 |
- 完成VS Code风格UI复刻:左侧工具栏、项目树、双分栏MD/JSON编辑区。
- 实现本地MD/JSON文件的新建/保存/编辑功能。
- 完成轻量化基础:安装包≤5MB,启动≤0.5秒,内存≤50MB。
- 核心目标:验证“轻量化+VS Code UI+MD/JSON结构化”核心体验。
- 开发人设图形化编辑器(卡片+关系线)、章节时间轴编辑器。
- 实现图形化操作与MD/JSON的双向同步。
- 开发大纲树、伏笔标签管理功能。
- 核心目标:完成小说专属的结构化管理能力。
- 接入本地轻量LLM模型(llama.cpp HTTP 服务器;Ollama)。
- 实现结构化补全、人设对话优化功能(
PromptTemplate+build_dialogue_optimization_prompt)。 - 适配主流云端LLM API(OpenAI 兼容格式)。
- 引入 API + Skill (Agent) 架构:
Skilltrait + 4 内置技能 +AgentBackend(工具调用循环)。 - 核心目标:完成LLM与结构化文本的联动,LLM 可自主查询项目数据。
- 配置持久化:LLM配置、界面设置自动保存/恢复到本地配置文件。
- 反向同步:从 JSON/MD 文件恢复世界对象、章节结构、伏笔到图形化界面(补齐双向同步缺口)。
- 全文搜索:跨项目全文搜索(Ctrl+Shift+F),支持正文、人设、章节过滤。
- 导出与备份:项目打包为 ZIP,章节导出为纯文本/Markdown 合集。
- 核心目标:补齐核心验收标准,提升用户体验稳定性。
- 自动保存:防止意外关闭造成数据丢失,状态栏显示自动保存状态。
- 文件树重命名/删除:补齐文件树右键菜单缺失的基础操作(重命名、移入废稿/删除)。
- 亮/暗主题切换:UI 视觉配置(跟随系统 / 强制亮色 / 强制暗色),持久化到配置文件。
- 编辑器字体大小:编辑器字号独立于预览字号,支持 Ctrl+滚轮快速缩放。
- 关系图谱:世界对象「图谱」视图,可视化对象关联关系网络。
- 核心目标:消除已知 UX 短板,达到可面向真实用户发布的产品完成度。
- 轻量化:安装包≤5MB,启动≤0.5秒,编辑10万字小说内存≤50MB,无后台冗余进程。
- VS Code体验:工具栏/项目树/编辑区交互逻辑与VS Code一致,快捷键复用率≥90%。
- 结构化:所有图形化操作可同步为MD/JSON文本,文本修改可反向同步到图形化界面。
- 场景化:支持人设关系调整、章节顺序调整、伏笔管理,无编程相关功能。
- 本地优先:所有操作本地完成,无强制联网,可离线使用。
src/
├── main.rs # 程序入口
└── app/
├── mod.rs # TextToolApp 结构体、核心逻辑(项目/文件/同步/LLM辅助方法)及单元测试
├── models.rs # 数据模型(RelationKind、WorldObject、StructNode、Foreshadow、LlmConfig、Panel 等)
├── file_manager.rs # 文件系统结构(FileNode、OutlineEntry、OpenFile)及 rfd 文件对话框封装
├── llm_backend.rs # LLM后端实现(MockBackend、ApiBackend、LocalServerBackend、PromptTemplate、LlmTask)
├── agent.rs # Agent 架构(Skill trait、4个内置技能、SkillSet、AgentBackend 工具调用循环)
├── ui_helpers.rs # 公共 UI 组件(菜单栏、工具栏、状态栏、新建文件对话框、键盘快捷键)
└── panel/ # 各功能面板 UI(按面板分组)
├── mod.rs # 声明子模块
├── novel.rs # 小说编辑面板(文件树、双分栏编辑区)
├── characters.rs # 人设&章节面板(人物列表/卡片视图、关系管理)
├── outline.rs # 大纲&伏笔面板(大纲树/时间轴视图、伏笔管理、里程碑追踪)
└── llm.rs # LLM辅助面板(模型配置、Agent 模式、提示词模板、对话优化、输出展示)
项目早期将全部逻辑放在一个 src/app.rs 中(~1764 行)。随着功能增加,单文件会带来一系列问题,因此改为 src/app/ 目录模块,并将各面板进一步归入 src/app/panel/ 子目录。两种方式的对比如下:
| 维度 | 单文件 src/app.rs |
目录模块 src/app/ + panel/ |
|---|---|---|
| 可读性 | 滚动千行才能找到目标函数 | 文件名即功能名,直接打开对应文件 |
| 职责划分 | 数据模型、UI 渲染、文件操作混在一起 | 每个文件只做一件事,边界清晰 |
| 层级结构 | 所有代码平铺 | 面板代码集中在 panel/,与公共基础设施分离 |
| 并行开发 | 多人同时改同一文件极易产生 Git 冲突 | 不同面板由不同文件承载,冲突概率大幅降低 |
| 编译速度 | 任何改动都重新编译整个文件 | 只重新编译被修改的子模块 |
| 可测试性 | 测试代码与业务代码堆在一起 | 可在各子模块内独立编写和运行单元测试 |
| 扩展性 | 新增面板/功能需在同一文件里插入代码 | 在 panel/ 下新增 xxx.rs 文件,不影响其他模块 |
Rust 说明:在 Rust 中,
src/app.rs与src/app/mod.rs对外导出的模块名完全相同(都是mod app),调用方无需任何修改。目录形式是官方推荐的大型模块组织方式,两者在语义上等价,仅在文件布局上有区别。
src/
├── main.rs # 应用入口
├── app/
│ ├── mod.rs # 应用模块声明
│ ├── models.rs # 数据模型(Character, Panel等)
│ ├── file_manager.rs # 文件管理逻辑
│ ├── ui_helpers.rs # UI辅助函数
│ └── panel/
│ ├── mod.rs # 面板模块声明
│ ├── novel.rs # 小说编辑面板
│ ├── characters.rs # 人设&章节面板
│ ├── outline.rs # 大纲&伏笔面板
│ └── llm.rs # LLM辅助面板
└── assets/
└── NotoSansCJKsc-Regular.otf # 中文字体
欢迎提交Issue和Pull Request。请遵循项目的设计原则,保持轻量化。
MIT License