🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

AI 小说创作工作台 EthanYoQ/AI-Novel-Writer

DeepSeek Harness
EthanYoQ16 天前有提交已提供中文文档扫描:高危

AI 小说创作软件:把灵感、角色、世界观、大纲、章节写作、审稿和修稿组织成可控工作流;提供 Windows/macOS 桌面版,支持本地和在线模型,集成 Ollama,并有 DeepSeek Harness(DSH)插件预览。

70.7/100
综合分
1,591
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add EthanYoQ/AI-Novel-Writer
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · browser
装得上吗
实装验证未通过(dependency_conflict),装前请到仓库确认最近更新与 issue
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/27) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包ai-novel-writer(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.14.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/29 01:38:37

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 84 处,展示前 71 条)
  • 发起网络请求
    electron/controllers/app-data-controller.ts:264
    const repositoryResponse = await fetch(
  • 发起网络请求
    electron/controllers/app-data-controller.ts:281
    const response = await fetch(resolvedUrl, {
  • 读取本地文件
    electron/controllers/import-controller.ts:78
    const stats = statSync(canonicalLocation, { bigint: true })
  • 读取本地文件
    electron/controllers/import-controller.ts:377
    const selectedSize = statSync(identity.canonicalLocation).size
  • 读取密钥环境变量
    electron/embedding.ts:166
    const token = process.env.AI_NOVEL_RELEASE_SMOKE_TOKEN
  • 发起网络请求
    electron/embedding.ts:254
    const res = await fetch(url, {
  • 发起网络请求
    electron/embedding.ts:292
    const res = await fetch(url, {
  • 发起网络请求
    electron/llm/gemini-provider.ts:118
    const res = await fetch(url, {
  • 发起网络请求
    electron/llm/gemini-provider.ts:197
    const res = await transport.response(fetch(url, {
  • 发起网络请求
    electron/llm/openai-provider.ts:124
    const res = await fetch(url, {
  • 发起网络请求
    electron/llm/openai-provider.ts:191
    const res = await transport.response(fetch(url, {
  • 读取本地文件
    electron/mcp/mcp-manager.ts:137
    const raw = await readFile(path, 'utf-8')
  • 执行外部命令来自配置/变量
    electron/mcp/mcp-manager.ts:263
    const proc = spawn(command, args, {
  • 读取本地文件
    electron/security/windows-safe-file-system.ts:161
    const information = statSync(canonicalRoot, { bigint: true })
  • 读取本地文件
    electron/security/windows-safe-file-system.ts:277
    if (packagedPath && existsSync(packagedPath)) return packagedPath
  • 读取本地文件
    electron/security/windows-safe-file-system.ts:282
    if (existsSync(sourcePath)) return sourcePath
  • 执行外部命令来自配置/变量
    electron/security/windows-safe-file-system.ts:317
    return spawn(command, args, {
  • 读取本地文件
    electron/security/windows-safe-file-system.ts:549
    || !existsSync(packagedPath)
  • 读取本地文件
    electron/security/windows-safe-file-system.ts:555
    if (!existsSync(helperPath)) throw secureError('SECURE_FS_HELPER_UNAVAILABLE')
  • 读取本地文件
    electron/services/project-archive-service.ts:934
    for await (const chunk of createReadStream(file)) digest.update(chunk as Buffer)
  • 读取本地文件
    electron/services/project-restore-service.ts:486
    for await (const chunk of createReadStream(file)) digest.update(chunk as Buffer)
  • 发起网络请求
    electron/services/webdav-backup-service.ts:300
    const response = await this.request(account, endpoint, {
  • 发起网络请求
    electron/services/webdav-backup-service.ts:352
    const response = await this.request(input.account, generationsUrl, {
  • 发起网络请求
    electron/services/webdav-backup-service.ts:405
    const response = await this.request(input.account, location, { method: 'GET' }, input.signal, this.transferTimeoutMs)
  • 发起网络请求
    electron/services/webdav-backup-service.ts:506
    const response = await this.request(account, url, { method: 'MKCOL', headers: { 'If-None-Match': '*' } }, signal)
  • 发起网络请求
    electron/services/webdav-backup-service.ts:516
    const response = await this.request(account, url, {
  • 发起网络请求
    electron/services/webdav-backup-service.ts:540
    const response = await this.request(account, url, {
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:321
    const configured = await lstat(root)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:331
    canonical = await realpath(root)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:344
    const value = await lstat(path)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:358
    const value = await lstat(path)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:362
    return await readFile(path)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:380
    const entries = await readdir(directory, { withFileTypes: true })
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:561
    await mkdir(archivePath, { recursive: true, mode: 0o700 })
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:566
    await mkdir(join(destination, '..'), { recursive: true, mode: 0o700 })
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:575
    await rm(temporary, { force: true })
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:577
    await writeFile(temporary, record.bytes, { flag: 'wx', mode: 0o600 })
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:592
    await rm(temporary, { force: true })
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:614
    rm(path, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:615
    rm(`${path}-journal`, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:616
    rm(`${path}-wal`, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-migration.ts:617
    rm(`${path}-shm`, { force: true }),
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:426
    await mkdir(projectDir, { recursive: true, mode: 0o700 })
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:474
    await mkdir(parent, { recursive: true, mode: 0o700 })
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:511
    text = normalizeText(await readFile(filename, { encoding: 'utf8', signal }))
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:618
    const entries = await readdir(directory, { withFileTypes: true })
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:637
    canonical = await realpath(this.#root)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:650
    if ((await lstat(path)).isSymbolicLink()) {
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-project.ts:684
    await lstat(path)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1831
    const existing = await lstat(projectDirectory)
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1842
    await mkdir(projectDirectory, { recursive: true, mode: 0o700 })
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1843
    const created = await lstat(projectDirectory)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1850
    const existingIgnore = await lstat(gitignore)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1854
    const existing = await readFile(gitignore, 'utf8')
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1930
    rm(path, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1931
    rm(`${path}-journal`, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1932
    rm(`${path}-wal`, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:1933
    rm(`${path}-shm`, { force: true }),
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:3004
    canonicalRoot = await realpath(root)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:3011
    const databaseFile = await lstat(databasePath)
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:3156
    rm(databasePath, { force: true }),
  • 删除本地文件
    plugins/dsh-ai-novel-writer/src/novel-store.ts:3157
    rm(`${databasePath}-journal`, { force: true }),
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:58
    await mkdir(presetRoot, { recursive: true, mode: 0o700 })
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:64
    const contents = await readFile(join(templateRoot, filename), 'utf8')
  • 写入本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:69
    await rename(stagingRoot, targetRoot)
  • 删除本地文件递归
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:78
    if (!published) await rm(stagingRoot, { recursive: true, force: true })
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:137
    targetStat = await lstat(targetRoot)
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:144
    const entries = (await readdir(targetRoot)).sort()
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:150
    const entry = await lstat(join(targetRoot, filename))
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:153
    readFile(join(templateRoot, filename)),
  • 读取本地文件
    plugins/dsh-ai-novel-writer/src/preset-installer.ts:154
    readFile(join(targetRoot, filename)),
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 组织小说创作流程
  • 角色与世界观设定
  • 章节写作与审稿修稿

README

由 DeepSeek 最新模型翻译生成
AI 小说作家 / AI Novel Writer 面向 AI 长篇小说创作的桌面工作台。它把「前提 → 角色 → 世界观 → 章节蓝图 → 草稿 → 审稿 → 修稿 → 定稿」组织成一条可追溯的创作流程;模型由你自行配置,项目资料留在你的电脑上。 下载桌面版(Windows / macOS) · 安装 DeepSeek Harness Web 插件 DeepSeek Harness 插件提示: 0.1.0 预览版目前冻结维护,短期不扩展功能;它的能力不足桌面软件版的 10%,不能替代桌面版。需要完整项目树、批量工作流、成熟编辑器或自动审校时,请使用上方的桌面版。 1.2.0-Preview - 大纲和蓝图支持分批生成与中断恢复,可设置每章目标字数。 - 续写下一章时带入上一章全文,短章补写时带入本章全文。 - 人物管理支持更多角色和关系。发现新人物时,可新建、关联已有角色或暂不处理。 - 旧项目导入和备份恢复会创建新版副本,保留原项目。可备份完整项目归档。 保留的 1.0.0 功能 - 写作 Skill 可独立安装,并按规划、正文、审稿或润色阶段分别使用。 - 故事线视图展示主线和支线进度,并可跳到对应章节依据。 - 规划资料可导入项目,让蓝图和后续写作使用同一套设定。 - 角色表接收蓝图中明确确认的新角色,并持续记录角色状态。
展开完整文档(README 剩余 1 节)
AI 小说作家 / AI Novel Writer

面向 AI 长篇小说创作的桌面工作台。它把「前提 → 角色 → 世界观 → 章节蓝图 → 草稿 → 审稿 → 修稿 → 定稿」组织成一条可追溯的创作流程;模型由你自行配置,项目资料留在你的电脑上。

下载桌面版(Windows / macOS) · 安装 DeepSeek Harness Web 插件

DeepSeek Harness 插件提示: 0.1.0 预览版目前冻结维护,短期不扩展功能;它的能力不足桌面软件版的 10%,不能替代桌面版。需要完整项目树、批量工作流、成熟编辑器或自动审校时,请使用上方的桌面版。

1.2.0-Preview

- 大纲和蓝图支持分批生成与中断恢复,可设置每章目标字数。
- 续写下一章时带入上一章全文,短章补写时带入本章全文。
- 人物管理支持更多角色和关系。发现新人物时,可新建、关联已有角色或暂不处理。
- 旧项目导入和备份恢复会创建新版副本,保留原项目。可备份完整项目归档。

保留的 1.0.0 功能

- 写作 Skill 可独立安装,并按规划、正文、审稿或润色阶段分别使用。
- 故事线视图展示主线和支线进度,并可跳到对应章节依据。
- 规划资料可导入项目,让蓝图和后续写作使用同一套设定。
- 角色表接收蓝图中明确确认的新角色,并持续记录角色状态。
- 中文长篇工作流串联蓝图、草稿、审稿、修订和定稿。
- Windows 和 macOS 均可查看并启动适合本机的更新。

1.0.0 的多草稿保存、旧请求覆盖、来源恢复、导出与安装检查修复继续保留。本次更新见 1.2.0-Preview 更新内容。正式安装包以 GitHub Release 为准。

DeepSeek Harness 插件(早期 MVP)

除了 Windows 与 macOS 桌面版,本仓库还保留 @ethanyoq/dsh-ai-novel-writer 0.1.0 开发预览。该插件目前冻结维护,短期不扩展功能。DeepSeek Harness 的 V2 工作台是刻意收敛的早期 MVP,当前能力不足桌面软件版的 10%;它不读取桌面版 .vela 项目,也不能替代桌面版的项目树、批量工作流、成熟编辑器或自动审校。

V2 只提供人工审核的最小创作链:项目设置 → 故事架构 → 人物设定 → 全书纲要 → 逐章蓝图 → 逐章正文。模型生成的待审核建议到达 Proposal 收件箱后,会先填入右侧工作台的本地编辑表单,供人工查看和修改;只有用户明确审核并应用 Proposal,权威项目状态才会改变。

该插件不属于桌面版正式 Release,但已发布为独立 npm 包,拥有独立锁文件、CI 和 MIT 许可;仓库根目录仍为 GPL-3.0 桌面应用。将它安装到 DeepSeek Harness 的 web profile:

dsh plugin --profile web add @ethanyoq/dsh-ai-novel-writer
dsh --profile web
源码开发、固定 tarball 安装和 Windows 含空格路径限制由插件安装指南单独维护,根 README 不复制这些易变化的维护者步骤。

启动 Web 后,打开「小说工作台」,安装 「AI 小说作家 V2」 Preset;随后新建会话并选择该 Preset。V2 的 AI 起草结果会先回填到右侧工作台的本地编辑表单,供人工修改和审核;点击应用 Proposal 才会写入项目。完整功能、项目格式、验证范围和卸载方式见插件说明。不要使用 dsh plugin add github:EthanYoQ/AI-Novel-Writer:仓库根包是桌面应用,不是可激活的 DSH bundle。

产品定位

AI 小说作家不是内置模型服务,也不是在线小说平台。它提供的是创作编排层:保存项目状态、组织提示词与上下文、管理章节蓝图和草稿版本,并把生成、审稿和修稿串起来。

你可以接入本地或云端模型;软件不会替你提供或托管模型额度。长篇创作时,系统会围绕当前章节蓝图、相关角色资料、世界观、历史摘要和可选参考文风组织上下文,而不是把整本小说塞进一次聊天记录。

flowchart LR
A[创作前提] --> B[角色与世界观]
B --> C[情节大纲与章节蓝图]
C --> D[章节草稿]
D --> E[审稿报告]
E --> F[修稿与定稿]
F --> G[下一章的项目上下文]

界面预览

AI 小说作家 v0.8.5 主界面,展示虚构项目、小说配置、项目结构、AI 写作助手和任务面板

核心能力

| 能力 | 说明 |
| 结构化创作流程 | 从前提、角色、世界观到章节蓝图、草稿、审稿、修稿和定稿,按阶段组织创作资产。 |
| 章节级生成 | 生成时围绕当前章节的蓝图和相关资料组织上下文,减少跨章跑题。 |
| 生成失败恢复 | 章节生成失败但已有可见正文时,会把正文保存在当前项目的恢复候选中;候选不是正式草稿,源蓝图或草稿变化后不可继续,但可丢弃。 |
| 审稿与修稿 | 为草稿生成结构化审稿信息,并以报告作为修稿输入。 |
| 角色卡与项目资料 | 在项目内维护角色、世界观、蓝图、草稿和定稿;项目会话机制避免旧窗口向重新打开的项目写入数据。 |
| 剧情树与叙事线索 | 以章节轨道展示主线、支线和来源进度;剧情树是可重建的只读快照,不会取代作者事实。 |
| 写作 Skills 与提示词模板 | 可按创作阶段绑定补充写作方法并定制中英文创作指导;语言、输出结构和工具协议仍由隐藏合同保护。 |
| 文风控制 | 章节定稿不会自动改写小说配置中的文风;你仍可手动编辑,或主动运行文风分析、导入小说建立仿写指南。 |
| 参考文本与知识库 | 可导入常见文本格式作为参考资料;未配置 embedding 时仍可使用 SQLite FTS 全文检索。 |
| 批量创作任务 | 单独的批量章节创作任务可设为 1–10 章,支持暂停、取消;后处理失败会停止后续章节。 |
| 中英文界面 | 首次启动可跟随系统语言,手动选择会持久保存。 |

生成情节大纲时,可在「AI 生成架构」中明确填写本次章节范围;超过 20 章的项目默认从第 1–20 章开始。完成一批后可从下一章继续;若生成中断且保留了有效断点,可从原断点恢复。如果已修改原大纲或参与生成的源设定与指导,旧断点不会直接接到新内容上,需要重新生成相应范围。

模型配置

目前支持两类调用协议:

- OpenAI-compatible:适用于 OpenAI、DeepSeek、Ollama、NovelAI 预设及其他兼容 Chat Completions 的服务。
- Gemini 原生协议:适用于 Google Gemini 兼容端点。

「自定义 API」指的是在上述协议范围内自定义地址、模型标识和凭据;它不是任意 HTTP 协议或可执行脚本编辑器。Anthropic、Azure、KoboldAI 原生协议等不同接口需要单独的适配器,不能仅靠替换 URL 保证兼容。

Ollama

推荐通过 Ollama 的 OpenAI-compatible 服务接入:

Provider: Ollama(本地)或自定义 Protocol: OpenAI-compatible Base URL: http://127.0.0.1:11434/v1 API Key: 可留空;若界面要求,可填任意本地占位值 Model: 你的 Ollama 模型名,例如 qwen3:14b

数据、隐私与边界

| 数据或行为 | 默认位置 / 去向 |
| 小说项目、角色、蓝图、草稿和定稿 | 你的项目目录与本地 SQLite 数据库。 |
| 生成失败的恢复候选 | 只保存在当前项目的本地 SQLite 数据库;不会自动成为草稿、定稿或连续性事实。 |
| 导入的参考资料 | 保留在本地项目范围内,除非你自行把内容发送给云端模型。 |
| 本地模型请求 | 发送给你配置的本机或局域网推理服务。 |
| 云端模型请求 | 当你选择 OpenAI、DeepSeek、Gemini 或其他云端端点时,提示词和上下文会发送给该服务商。 |
| 模型配置与 API Key | 当前保存在本机用户目录 ~/.vela/models.json;请保护操作系统账户,不要分享该文件。 |
| 应用偏好与更新延后设置 | 保存在 ~/.vela/config.json。 |

软件本身不提供模型账号、云端生成服务或运营消息推送。联网更新检查只读取公开 GitHub Release;用户可手动检查,也可在发现更新后暂缓提醒。

安装与更新

Windows x64

正式版使用 Windows NSIS 安装程序:

ai-novel-writer-setup-<版本号>.exe

1. 只从 GitHub Releases 下载正式安装包。
2. 安装程序更新应用本身,不应删除小说项目、角色卡或已有设置;仍建议在升级前自行备份重要作品。
3. 安装后可在欢迎页使用「检查更新」;应用启动后也会按每日一次的成功检查频率静默检查。发现正式更新时先提示,只有用户点击「下载更新」后才开始下载;下载完成后再提供「立即重启更新 / 稍后」的选择。
4. 旧版便携 ZIP 不能自行获得首个更新器版本,需要手动安装一次正式安装包;后续不再维护新的便携 ZIP。

当前安装程序尚未进行代码签名。Windows 可能显示发布者或信誉提示;请确认下载页面属于本项目的官方 GitHub Release 后再继续。

macOS(Apple Silicon 与 Intel)

从 GitHub Releases 下载与你的 Mac 架构对应的安装包:

ai-novel-writer-mac-arm64-<版本号>-installer.dmg ai-novel-writer-mac-x64-<版本号>-installer.dmg

1. arm64 适用于 Apple Silicon Mac(M1、M2、M3、M4 等);x64 适用于 Intel Mac。
2. 将 DMG 中的应用拖入“应用程序”文件夹后启动。应用可以检查 GitHub 最新正式版并显示提醒,但不会在 macOS 内下载或替换程序;更新操作只打开官方 Release 页面,由用户手动下载对应架构的后续版本。
3. 两个安装包均为 ad-hoc 签名,且均未使用 Developer ID 签名或公证。若 Gatekeeper 阻止打开,请确认来源是本项目的官方 GitHub Release,然后在 Finder 中按住 Control 点击应用并选择“打开”,或在“系统设置 → 隐私与安全性”中允许打开。

当前限制

- 不承诺任意第三方 API 都能仅靠 URL 和 Key 接入;只保证已实现协议与预设范围内的行为。
- 不替代作者的创意、事实核查或版权判断;AI 输出需要作者审阅。
- 不提供在线发布、阅读社区或云端模型账号。
- 正式安装包由 GitHub Actions 云端构建;Windows、macOS ARM64 与 macOS x64 会各自通过资格检查后,才会进入同一个 GitHub Release。

开发与架构文档

文档权威层级、ADR、调研、Agent 规则和任务交接入口见 docs/README.md。DeepSeek Harness 插件拥有独立的插件说明,不作为桌面版行为的来源。

许可证

GPL-3.0
预览分享卡片长什么样 ↓EthanYoQ/AI-Novel-Writer
分享 · DeepSeek Harness Hub
EthanYoQ/AI-Novel-Writer

AI 小说创作软件:把灵感、角色、世界观、大纲、章节写作、审稿和修稿组织成可控工作流;提供 Windows/macOS 桌面版,支持本地和在线模型,集成 Ollama,并有 DeepSeek Harness(DSH)插件预览。

回到顶部