Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 135 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,74 +1,168 @@
# Creator Studio

AI 驱动的小说写作助手
Creator Studio 是一个面向长篇小说创作的桌面应用,基于 Tauri、React、TypeScript 和 Rust 构建。项目当前重点覆盖章节管理、正文编辑、AI 对话与续写,以及围绕安装包、默认模型和编辑器交互建立的回归测试体系

## 项目简介
## 安装

Creator Studio 面向长篇小说/系列创作场景,提供“项目-章节”结构化管理、编辑器能力,以及围绕写作流程设计的 AI 讨论与 AI 续写能力,帮助你更稳定地推进写作。
### Windows 用户

## 功能特性
- 优先使用安装包版本,不要直接运行 `src-tauri/target/debug/` 下的调试产物。
- 当前最新版安装包默认同步到项目根目录 [`release/`](C:/Users/16053/proj/07-story/Creator-Studio/release)。
- Windows 常用产物:
- `release/CreatorAI_<version>_x64_en-US.msi`
- `release/CreatorAI_<version>_x64-setup.exe`

- **章节管理**:项目创建/打开、章节增删改查、章节列表与排序、导入 txt 拆章
- **写作编辑**:Undo/Redo、字数统计、自动保存
- **AI 讨论**:围绕剧情、人物、世界观进行多轮讨论与方案推演
- **AI 续写**:基于当前章节与上下文续写,可选择插入到正文
- **写作预设**:风格/口吻/视角、角色设定、禁用词等写作约束与偏好
### macOS 用户

## 安装说明
- macOS 打包产物会出现在项目根目录 `release/`,常见文件为 `.dmg`。

### macOS(使用 .dmg)
### 默认 AI Provider

1. 下载并打开 `.dmg` 安装包
2. 将应用拖拽到“Applications/应用程序”
3. 首次运行如遇到系统拦截,可在“系统设置 → 隐私与安全性”中允许打开
- 应用内置默认 Provider 配置,预置 Base URL、Provider 类型和默认模型。
- 出于安全原因,软件不再内置任何真实 API key。
- 首次使用 AI 前,用户需要在设置中为当前 Provider 手工填写自己的 API key。
- 当前默认配置:
- Base URL: `https://dashscope.aliyuncs.com/compatible-mode/v1`
- Model: `qwen-plus`

> 说明:当前打包产物的应用/安装包名称可能显示为 `CreatorAI`(由 `src-tauri/tauri.conf.json` 的 `productName` 决定)。
## 开发

### 从源码运行(开发者)
### 环境要求

前置依赖:
- Node.js(建议 18+)
- Rust(stable)
- Bun(用于编译内置 `ai-engine` sidecar;不想装 Bun 可直接使用发布版应用)
- macOS 需要 Xcode Command Line Tools:`xcode-select --install`
- Node.js 18+
- npm
- Rust stable
- Windows 下需要可用的 Rust MSVC 工具链

安装依赖
### 安装依赖

```bash
npm install
```

启动开发模式(Tauri):
### 启动开发环境

```bash
npm run tauri:dev
```

构建安装包(macOS .dmg):
说明:
- 该命令会先构建 AI sidecar,再启动前端和 Tauri 桌面壳。
- 不要把调试版可执行文件当成发布版验证结果;Windows demo、安装包联调要使用安装版或 release 版。

## 测试

项目已经拆出独立测试子工程 [`test-suite/`](C:/Users/16053/proj/07-story/Creator-Studio/test-suite),后续新增功能和修 bug 都应优先在这里补测试,而不是继续堆临时脚本。

### 常用测试命令

```bash
npm run test:default-provider
npm run test:ai-engine-sidecar
npm run test:no-hardcoded-secrets
npm run test:editor-shortcuts
npm run test:editor-e2e
npm run test:windows-demo
npm run test:regression
```

### 测试要求

- 修复 bug 时,优先补一个可复现该问题的测试用例。
- 安装包问题必须补安装链路或运行链路测试。
- 编辑器交互问题必须补实际交互回归测试,必要时走 Playwright。
- 凡是安全修复,都必须补对应的仓库扫描或回归校验。
- 技术说明同时写入 `bug/` 和 `test-suite/docs/`,保证后续模型可直接接手。

详细规则见:
- [test-suite/README.md](C:/Users/16053/proj/07-story/Creator-Studio/test-suite/README.md)
- [test-suite/docs/testing-rules.md](C:/Users/16053/proj/07-story/Creator-Studio/test-suite/docs/testing-rules.md)

## 打包

### 本地构建

```bash
npm run tauri:build
```

## 使用说明
该命令会执行三件事:
- 构建 AI engine sidecar
- 执行 Tauri release build
- 将最终安装包同步复制到项目根目录 `release/`

### Tauri 实际输出目录

Tauri 原始 bundle 输出目录不是根目录 `release/`,而是:

- `src-tauri/target/release/bundle/msi/`
- `src-tauri/target/release/bundle/nsis/`
- macOS 对应 `src-tauri/target/release/bundle/dmg/`

项目根目录 `release/` 的作用是:

- 作为统一交付目录
- 方便人工验收
- 方便后续上传到 GitHub 或发给测试同学

### 打包前检查

- 确认版本号已更新
- 先跑核心回归测试
- 确认默认 Provider 配置存在且模型选择正常
- 确认没有硬编码 API key
- 确认安装后 AI 引擎能正常启动
- 确认不会弹黑色 shell 窗口

相关记录见:
- [bug/package_building_notes.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/package_building_notes.md)
- [bug/default_provider_dashscope_qwen_demo.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/default_provider_dashscope_qwen_demo.md)

## 发布

### 当前约定

- 每次完成可交付构建后,把最新安装包同步到项目根目录 `release/`
- 对外说明时,以 `release/` 中的产物为准
- 不把 Tauri 内部产物路径直接发给最终用户
- 不得把任何真实 API key 写入代码、文档、测试样例或安装包默认配置

### 推荐发布流程

1. 更新版本号
2. 运行核心回归测试
3. 执行 `npm run tauri:build`
4. 验证 `release/` 中的最新 MSI/EXE
5. 安装后做一次实际启动与 AI 请求验证
6. 确认 GitHub Release 附件不包含敏感信息
7. 再上传到 GitHub Release 或交付渠道

如果只是需要本地找到安装包:

- 根目录交付目录:[`release/`](C:/Users/16053/proj/07-story/Creator-Studio/release)
- Tauri 原始输出目录:[`src-tauri/target/release/bundle/`](C:/Users/16053/proj/07-story/Creator-Studio/src-tauri/target/release/bundle)

1. **创建/打开项目**:选择一个工作目录作为项目根目录
2. **导入或新建章节**:可导入 txt 自动拆章,或手动新建章节
3. **编辑写作**:在编辑器中完成正文创作,应用自动保存/撤销重做等能力
4. **AI 面板**:
- 选择“讨论”模式:梳理情节、推演冲突、完善设定
- 选择“续写”模式:基于上下文生成续写内容并插入到正文
5. **写作预设**:为不同作品配置风格、角色设定与写作约束,提升一致性
## 目录说明

## 知识库(RAG)
- [`src/`](C:/Users/16053/proj/07-story/Creator-Studio/src):前端界面与编辑器逻辑
- [`src-tauri/`](C:/Users/16053/proj/07-story/Creator-Studio/src-tauri):Tauri 后端、配置和 sidecar 启动逻辑
- [`packages/ai-engine/`](C:/Users/16053/proj/07-story/Creator-Studio/packages/ai-engine):AI 引擎源码
- [`scripts/`](C:/Users/16053/proj/07-story/Creator-Studio/scripts):构建与产物同步脚本
- [`test-suite/`](C:/Users/16053/proj/07-story/Creator-Studio/test-suite):独立测试工程
- [`bug/`](C:/Users/16053/proj/07-story/Creator-Studio/bug):缺陷记录、修复注释、打包与回归说明
- [`release/`](C:/Users/16053/proj/07-story/Creator-Studio/release):同步后的交付产物目录

- 把人物/设定/时间线等资料放在项目目录的 `knowledge/`(支持 `.md/.txt`),在侧边栏「知识库」里点击“构建索引”。
- 索引与缓存默认保存到项目目录的 `.creatorai/rag/`。
- 若自动下载嵌入模型失败,可设置环境变量 `HF_ENDPOINT`(例如 `https://hf-mirror.com`),或手动下载模型文件放到 `.creatorai/rag/models/Xenova/bge-small-zh-v1.5/`。
## 最近重点修复

## 技术栈
- 修复安装版 AI 引擎启动失败问题
- 修复安装后频繁弹出黑色 shell 窗口问题
- 修复编辑器自动保存后内容被旧状态覆盖的问题
- 补齐 `Ctrl+S`、`Ctrl+Z`、`Ctrl+Y`、`Ctrl+Shift+Z`、`Ctrl+A` 等常用快捷键
- 建立 Windows demo、默认 Provider、AI sidecar、编辑器交互回归测试
- 移除硬编码 API key,并加入泄露密钥清理和仓库扫描测试

- Tauri
- React
- TypeScript
- Rust
对应文档:
- [bug/editor_autosave_content_loss.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/editor_autosave_content_loss.md)
- [bug/editor_shortcuts_improvement.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/editor_shortcuts_improvement.md)
- [bug/editor_interaction_regression_tests.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/editor_interaction_regression_tests.md)
- [bug/windows_demo_server_connection_note.md](C:/Users/16053/proj/07-story/Creator-Studio/bug/windows_demo_server_connection_note.md)
47 changes: 47 additions & 0 deletions bug/MLComputePlan_link_error_solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# MLComputePlan 符号链接错误解决方案

## 问题描述
在 macOS 上编译包含 ONNX Runtime 的 Rust 项目时,出现 `MLComputePlan` 符号未找到的链接错误:
```
error: could not compile `creatorai-v2` (lib) due to 1 previous error; 2 warnings emitted
```

## 问题原因
- `MLComputePlan` 类仅在 macOS 13.3+ 版本中可用
- ONNX Runtime (ort) 库需要访问这个类,但在较低版本的 macOS 上不存在
- 编译器试图链接到较低版本的 macOS,导致找不到该符号

## 解决方案
### 1. 添加弱链接
在 [build.rs](file:///Users/yuhanwen/Desktop/work/01-story/Creator-Studio/src-tauri/build.rs) 文件中添加对 MLCompute 框架的弱链接:
```rust
if cfg!(target_os = "macos") {
// 添加链接器参数以支持 CoreML 的新功能
println!("cargo:rustc-link-arg=-mmacosx-version-min=13.3");

// 如果是 ARM64 架构,添加额外的链接参数
if cfg!(target_arch = "aarch64") {
println!("cargo:rustc-link-arg=-stdlib=libc++");
}

// 添加弱链接,解决 MLComputePlan 符号问题
println!("cargo:rustc-link-arg=-Wl,-weak_framework,MLCompute");
}
```

### 2. 添加缺失的依赖项
在 [Cargo.toml](file:///Users/yuhanwen/Desktop/work/01-story/Creator-Studio/src-tauri/Cargo.toml) 中添加项目代码中使用但未声明的依赖:
```toml
regex = "1.10.4"
keyring = "2.3.3"
bincode = "1.3.3"
uuid = { version = "1.0.0", features = ["v4", "serde"] }
```

## 修复效果
- 项目能够在 macOS 上成功编译
- 应用可以正常运行,支持在不同版本的 macOS 上使用
- AI 推理功能正常工作

## 技术原理
使用 `-Wl,-weak_framework,MLCompute` 链接参数允许应用在缺少 MLCompute 框架的旧系统上运行,同时在支持的系统上充分利用该框架提供的功能。
46 changes: 46 additions & 0 deletions bug/build_packaging_notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# 构建和打包说明文档

## 构建过程记录

### 构建环境
- 操作系统: macOS
- 项目类型: Tauri 桌面应用程序
- 应用名称: CreatorAI
- 版本号: 0.1.12

### 构建命令
使用 `tauri build` 命令进行构建和打包。

### 构建时间
- 总构建时间: 3分49秒
- 这是一个包含AI推理库的大型Rust项目,因此构建时间相对较长

### 打包产物
成功生成以下文件:
1. macOS 应用程序包: `/Users/yuhanwen/Desktop/work/01-story/Creator-Studio/src-tauri/target/release/bundle/macos/CreatorAI.app`
2. macOS DMG 安装包: `/Users/yuhanwen/Desktop/work/01-story/Creator-Studio/src-tauri/target/release/bundle/dmg/CreatorAI_0.1.12_aarch64.dmg`

该DMG安装包已复制到release目录中。

## 关于Windows MSI包的说明

**重要提示**: 在当前的macOS环境中无法创建Windows MSI安装包。这是因为:

1. 平台限制: Tauri的打包功能是平台特定的,只能为当前操作系统创建安装包
2. Windows MSI包需要在Windows环境下构建
3. macOS无法原生编译或创建Windows特定的安装包格式

如果您需要Windows MSI安装包,您需要:
- 在Windows系统上运行 `tauri build`
- 或者使用交叉编译工具链
- 或者设置CI/CD流水线,在Windows构建代理上生成MSI包

## 项目特点

此项目包含大量AI推理相关的依赖库,包括:
- ONNX Runtime
- Tokenizers (v0.22.2 和 v0.15.2)
- FastEmbed (v5.12.1)
- 各种图像处理和机器学习库

这些库导致了较长的构建时间,但提供了强大的AI功能支持。
41 changes: 41 additions & 0 deletions bug/default_provider_dashscope_qwen_demo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# DashScope 默认 Provider 安全说明

## 当前策略

- 软件仍然内置一个默认 DashScope Provider。
- 该默认 Provider 只预置以下非敏感配置:
- Provider ID: `builtin_dashscope_qwen_demo`
- Provider Name: `DashScope Qwen Demo`
- Base URL: `https://dashscope.aliyuncs.com/compatible-mode/v1`
- Model: `qwen-plus`
- Provider Type: `openai-compatible`

## 安全调整

- 已移除代码中的硬编码 API key。
- 已移除首次加载时自动把默认 key 写入系统 keyring 的逻辑。
- 已加入旧泄露 key 清理逻辑:
- 如果本地 keyring 中检测到历史泄露 key,会自动删除。

## 为什么这样改

- 真实 API key 一旦进入源码仓库、安装包、公开 Release 或日志,就存在被盗刷风险。
- 默认 Provider 可以保留,方便用户少填一层 URL 和模型配置。
- 但 API key 必须改为用户本地自行配置,不能继续跟随软件分发。

## 用户侧行为

- 首次使用 AI 前,需要在设置中为当前 Provider 手工填写自己的 API key。
- API key 仍然保存在系统凭据库,不写入普通配置文件。

## 回归要求

- 仓库中不得出现任何真实 API key 字面量。
- 安全修复后必须补测试,当前已新增:
- `npm run test:no-hardcoded-secrets`
- `npm run test:regression`

## 额外处理建议

- 已经暴露过的 key 不应继续使用。
- 必须到供应商控制台立即废弃旧 key,并重新生成新 key。
27 changes: 27 additions & 0 deletions bug/editor_autosave_content_loss.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 编辑器自动保存后内容被旧状态覆盖

## 严重级别
- 严重

## 问题现象
- 在文本编辑框持续输入内容后,停顿触发自动保存,约一分钟内可能出现整段文本被清空或回退到旧版本的情况。
- 用户无法稳定保留新输入内容,属于高风险数据丢失缺陷。

## 根因
- 编辑器自动保存成功后,子组件的未保存状态会切换回 `false`。
- 这时父组件 `MainLayout` 中传给编辑器的 `initialContent` 仍然是保存前的旧值。
- 编辑器的同步逻辑在“当前无未保存改动”时会用 `initialContent` 重置编辑器内容,导致刚刚保存成功的新文本被旧内容覆盖。

## 修复方案
- 在 [`src/layouts/MainLayout.tsx`](c:\Users\16053\proj\07-story\Creator-Studio\src\layouts\MainLayout.tsx) 的 `handleSave` 中,Tauri 保存成功后立刻同步:
- `setChapterContent(content)`
- `setDraftContent(content)`
- 这样编辑器在自动保存完成后收到的 `initialContent` 已经是最新内容,不会再回滚到旧文本。

## 验证方式
- 执行 `npm run test:regression`
- 手工验证:
1. 打开任一项目章节。
2. 连续输入至少 1 分钟。
3. 停止输入,等待自动保存完成。
4. 确认文本未消失,重新切换章节后内容仍然存在。
Loading