dsh-openwrite 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -13,6 +13,7 @@
13
13
  <a href="package.json"><img src="https://img.shields.io/badge/dsh-0.1.2--rc.1-2563eb" alt="dsh 0.1.2-rc.1"></a>
14
14
  <a href="package.json"><img src="https://img.shields.io/badge/Node-%E2%89%A522.19-15803d" alt="Node >= 22.19"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-0f766e" alt="Apache-2.0"></a>
16
+ <a href="https://dsh-plugin.org/plugins/lipu-jpg/openwrite"><img src="https://dsh-plugin.org/badges/listed.svg" alt="Listed on dsh-plugin.org"></a>
16
17
  </p>
17
18
 
18
19
  <p align="center">
@@ -28,20 +29,23 @@
28
29
 
29
30
  ## 快速安装
30
31
 
31
- **0.2.7 标准插件包**兼容 dsh **0.1.2-rc.1**。可下载版本、三平台验收结果和 SHA-256 以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.7) 附件为准;验收方法见 [发布验收](docs/RELEASE_ACCEPTANCE.md)。默认使用 npm `latest` 渠道;商城所需的精确预览版兼容性、验证范围和安装限制见 [DSH STORE 接入](docs/DSH_STORE.md)。
32
+ **0.2.9 标准插件包**兼容 dsh **0.1.2-rc.1**。可下载版本、三平台验收结果和 SHA-256 以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/latest) 附件为准;验收方法见 [发布验收](docs/RELEASE_ACCEPTANCE.md)。默认使用 npm `latest` 渠道;商城所需的精确预览版兼容性、验证范围和安装限制见 [DSH STORE 接入](docs/DSH_STORE.md)。
32
33
 
33
34
  已有匹配版本 dsh 的用户执行:
34
35
 
35
36
  ```sh
36
- dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.7/dsh-openwrite-0.2.7.tgz
37
+ dsh plugin --profile web add -w dsh-openwrite@latest
37
38
  dsh web
38
39
  ```
39
40
 
41
+ `@latest` 在执行安装或升级命令时选择 npm 最新发布版本,不会自动替换正在运行的服务。无需在安装时编译源码。升级前停止 dsh,并核对目标版本的宿主兼容说明。需要复现或回退时,使用 `dsh-openwrite@0.2.8` 等精确版本;对应版本的 [npm 包](https://www.npmjs.com/package/dsh-openwrite)与 [Release 预编译包](https://github.com/LiPu-jpg/Openwrite/releases) 为同一份已验收产物。
42
+
40
43
  也可把这段话交给有终端权限的 Agent:
41
44
 
42
45
  ```text
43
46
  请按 https://github.com/LiPu-jpg/Openwrite 的 README 和对应 Release 安装 OpenWrite。
44
- 先核对 Release 验收结果、精确 dsh 版本和 SHA-256,再安装发布的 .tgz。
47
+ 先核对 Release 验收结果和精确 dsh 版本,再用 dsh plugin --profile web add -w dsh-openwrite@latest 安装。
48
+ 如宿主不兼容,安装最后一个匹配且已验收的精确版本,不自动升级宿主。
45
49
  已有本地安装先备份并迁移,保留作品、自定义预设、凭据和其他插件。
46
50
  启动 dsh web,指导我点击 OpenWrite、准备环境并选择自己的作品。
47
51
  不要调用写作模型做安装检查,不要自动升级宿主或放宽 pnpm 构建授权。
@@ -66,6 +70,27 @@ dsh web
66
70
 
67
71
  已有会话不会自动切换预设。详细操作与工作区规则见 [使用流程](docs/WORKFLOWS.md)。
68
72
 
73
+ ## 配置模型
74
+
75
+ 安装和环境健康检查不需要模型 API Key,也不会调用写作模型。与 Agent 对话、生成章节和审稿需要可用的模型配置;使用收费服务商时会产生 API 费用。
76
+
77
+ - **对话模型**:在 dsh 宿主中配置,用于 OpenWrite 创作会话。
78
+ - **小说生成、评审与测试模型**:在「任务 → 模型」添加服务商,按服务商提供的信息填写模型名、接口地址和 API Key。不要把密钥粘贴到对话、作品正文或 Git 仓库。
79
+ - **作品目录**:选择自己的本地目录;后端端口与 Python 环境由插件管理,无需手动配置。
80
+
81
+ 旧开发安装的全局模型配置不会自动迁入受管理环境,迁移步骤见 [安装指南](docs/INSTALL.md)。模型连通性测试可能实际调用服务商,应与不调用模型的环境健康检查区分。
82
+
83
+ ## 示例:从大纲开始一部新小说
84
+
85
+ 打开 OpenWrite,选择一个空的作品目录并完成初始化,然后进入 **OpenWrite 创作** 会话。可发送:
86
+
87
+ ```text
88
+ 请先帮我规划一部短篇悬疑小说:主角是一位修复旧照片的摄影师。
89
+ 先提出人物、核心谜题和五章大纲,等我确认后再生成正文。
90
+ ```
91
+
92
+ 确认大纲后使用 `/write-next` 开始写章,在「创作」中编辑正文或添加选区批注;使用 `/review-chapter` 审稿,在应用修订前查看差异。生成与评审会使用前面配置的模型。成稿通过 `/export-book` 或「任务 → 导入与导出」导出。
93
+
69
94
  ## 功能
70
95
 
71
96
  | 工作环节 | 可以做什么 |
package/docs/DSH_STORE.md CHANGED
@@ -13,7 +13,7 @@ OpenWrite 是一个完整的小说创作插件套件。商城安装目标是仓
13
13
 
14
14
  根包统一加载 `openwrite-bundle`、`openwrite-bridge`、`studio-panel`、`openwrite-dog`。这些既有 ID 保持稳定。`packages/openwrite-bridge`、`packages/studio-panel` 是内部开发包,不应和根包一起登记到同一个 Profile,也不需要删除它们或拆成独立商城条目。
15
15
 
16
- 源码安装必须固定到完整 Commit;`prepare` 会自包含构建三个内部插件,包含 Core wheel、编辑器静态资源、预设和许可证,不依赖相邻源码。构建授权仍遵循用户的 pnpm 设置。普通用户继续优先使用已验收的 GitHub Release `.tgz`,见 README。
16
+ 源码验收必须固定到完整 Commit;`prepare` 会自包含构建三个内部插件,包含 Core wheel、编辑器静态资源、预设和许可证,不依赖相邻源码。构建授权仍遵循用户的 pnpm 设置。普通用户优先使用 npm 预编译包:`dsh plugin --profile web add -w dsh-openwrite@latest`。latest 只在执行安装或升级时解析,运行中不自动更新。市场的版本、兼容和验收字段应记录实际核验的精确版本;不能把已有验收结果自动套用到未来版本。精确 npm 版本及对应 GitHub Release `.tgz` 继续用于复现与回退,见 README。
17
17
 
18
18
  ## 兼容声明与证据
19
19
 
package/docs/INSTALL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # 安装、更新与卸载
2
2
 
3
- 安装已发布的版本;可下载产物、SHA-256 和实际平台结果以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.7) 附件为准。验收方法见 [验收报告](RELEASE_ACCEPTANCE.md)。
3
+ 安装已发布的版本;可下载产物、SHA-256 和实际平台结果以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/latest) 附件为准。验收方法见 [验收报告](RELEASE_ACCEPTANCE.md)。
4
4
 
5
5
  ## 标准安装
6
6
 
@@ -9,10 +9,18 @@
9
9
  安装命令:
10
10
 
11
11
  ```sh
12
- dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.7/dsh-openwrite-0.2.7.tgz
12
+ dsh plugin --profile web add -w dsh-openwrite@latest
13
13
  dsh web
14
14
  ```
15
15
 
16
+ `@latest` 只在执行命令时解析 npm 最新发布版本;安装后不会后台自动升级。
17
+
18
+ 需要固定版本时,例如 npm 的 `dsh-openwrite@0.2.8` 与 GitHub Release 的 v0.2.8 `.tgz` 为同一份已验收产物,包含预编译插件、编辑器资源与 Core wheel。也可直接安装 Release:
19
+
20
+ ```sh
21
+ dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.8/dsh-openwrite-0.2.8.tgz
22
+ ```
23
+
16
24
  `-w` 是 pnpm profile workspace 的安装参数。只输入 `dsh` 会要求 `--profile`;启动浏览器使用 `dsh web`。浏览器地址由宿主输出,不固定为 3080。
17
25
 
18
26
  点击侧栏 OpenWrite,等待环境准备完成。下载和安装进度来自同一个运行时状态,支持取消与重试。选择已有作品目录,或选择空目录后在创作工作台初始化。入口创建新创作会话,已有会话、作品和预设不被改写。点击「创作」进入编辑器;无需发送第一条消息。
@@ -48,7 +56,7 @@ dsh 对话模型在宿主中配置。小说生成、评审与测试模型在「
48
56
  ```sh
49
57
  node package/scripts/maintenance.mjs migrate --profile web
50
58
  node package/scripts/maintenance.mjs migrate --profile web --apply
51
- dsh plugin --profile web add -w https://github.com/LiPu-jpg/Openwrite/releases/download/v0.2.7/dsh-openwrite-0.2.7.tgz
59
+ dsh plugin --profile web add -w dsh-openwrite@latest
52
60
  dsh web
53
61
  ```
54
62
 
@@ -60,9 +68,16 @@ dsh web
60
68
 
61
69
  ## 更新与回退
62
70
 
63
- 停止 dsh,对照新 Release 的精确宿主兼容版本,用新 `.tgz` 再执行 `plugin add`。环境安装使用临时目录,校验并成功启动后才替换活动记录;失败保留旧环境和配置。取消或失败后可从入口重试。
71
+ 停止 dsh,对照新 Release 的精确宿主兼容版本,再执行:
64
72
 
65
- 回退时,停止 dsh,重新安装上一份已验收 `.tgz`。官方预设采用版本 ID(如 `openwrite-0-2-1`),不会覆盖用户预设。请先把官方预设复制为 `openwrite-你的名称` 再修改;对被直接修改的同版本官方预设,插件保留文件并报告冲突。
73
+ ```sh
74
+ dsh plugin --profile web add -w dsh-openwrite@latest
75
+ dsh web
76
+ ```
77
+
78
+ `@latest` 不升级 dsh,也不改变已安装版本直到再次执行命令。环境安装使用临时目录,校验并成功启动后才替换活动记录;失败保留旧环境和配置。取消或失败后可从入口重试。
79
+
80
+ 回退时,停止 dsh,使用精确版本(例如 `dsh plugin --profile web add -w dsh-openwrite@0.2.8`)或重新安装上一份已验收 `.tgz`,再启动。官方预设采用版本 ID(如 `openwrite-0-2-1`),不会覆盖用户预设。请先把官方预设复制为 `openwrite-你的名称` 再修改;对被直接修改的同版本官方预设,插件保留文件并报告冲突。
66
81
 
67
82
  ## 卸载
68
83
 
@@ -84,7 +99,7 @@ bridge 的高级 `mode: external` / `baseUrl` 配置继续支持外部 Core,
84
99
 
85
100
  ## GitHub 源码安装
86
101
 
87
- 源码安装使用 dsh 官方 GitHub source 机制:`dsh plugin --profile web add -w github:LiPu-jpg/Openwrite#v0.2.7`。仓库 `prepare` 自行构建三个插件,Core wheel 随固定提交提供,不访问相邻工作区。源码安装需要 Git 和构建依赖;建议普通用户优先使用已验收 Release 包。
102
+ 源码安装使用 dsh 官方 GitHub source 机制:`dsh plugin --profile web add -w github:LiPu-jpg/Openwrite#v0.2.8`。仓库 `prepare` 自行构建三个插件,Core wheel 随固定提交提供,不访问相邻工作区。源码安装需要 Git 和构建依赖;建议普通用户优先使用已验收 Release 包。
88
103
 
89
104
  如果 pnpm 按本机策略阻止构建,按它显示的构建审批指引仅批准本包,再重试。安装脚本不放宽构建授权。源码安装也必须在发布验收中通过,不能用本机已编译目录代替。
90
105
 
@@ -97,3 +112,9 @@ bridge 的高级 `mode: external` / `baseUrl` 配置继续支持外部 Core,
97
112
  小说工具的只读 / 计划模式 / Workspace 绑定是 **dsh 策略与桥接检查**,不是操作系统沙箱。受管理 Python 与安装子进程只继承启动、代理和证书所需环境变量,不把无关 API Key 传给子进程。
98
113
 
99
114
  反馈请提供宿主版本、系统与架构、Release 版本、安装阶段及脱敏错误。来源、许可证和校验值见 Release 附件及包内 `release/`。不要提交 API Key、浏览器登录 URL 或作品全文。
115
+
116
+ ## 作品信息与推理模型预算
117
+
118
+ 在「任务 → 导入与导出 → 编辑作品信息」填写或修改书名、作者署名和语言。旧作品也可补齐作者,无需手工编辑配置文件。保存冲突时保留输入;请取消编辑并重新载入最新信息后再修改。未填写作者仍不能进行交付导出。`novel_project_init` 也支持可选 `author` 与 `language`。
119
+
120
+ 写章、事实提取和状态结算(包括重试)统一使用「任务 → 模型」中所选模型的输出 token 预算,不再在非创作阶段偷偷降到 4096/8192。推理模型的隐藏推理通常也占用输出额度:若仍出现截断,请在服务商允许的范围内提高所选模型的输出预算(例如 32768 或 49152),同时核对上下文窗口。正文目标字数与 token 预算是两回事;较高上限不等于一定消耗该数量,也不能保证所有模型都支持它。此次验证使用模型替身,未进行真实模型计费测试。
@@ -1,4 +1,25 @@
1
- # 0.2.7 发布验收记录
1
+ # 发布验收记录
2
+
3
+ ## CI 运行范围
4
+
5
+ 仅修改 README.md 或 docs 下的 Markdown 文档时,跳过插件维护与跨平台发布验收。预设、技能、脚本、依赖、资源和工作流变更仍触发检查;混合文档与代码的提交也照常检查。开发分支通过 PR 检查,避免同一提交在分支 push 与 PR 上重复执行;主分支合并后保留验收,两个工作流均可手动触发。发布必须使用完整验收通过的产物,跳过检查不能作为发布通过的证据。
6
+
7
+ 新建作品的验收请求最多等待 60 秒(原为 15 秒),保留成功耗时和失败诊断;不重试写请求,超时仍失败。此调整容纳慢速运行器,不代表初始化耗时问题已被修复。
8
+
9
+ ## 0.2.9
10
+
11
+ [Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.9) 与 npm dsh-openwrite@0.2.9 使用 [主分支 CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/34532531326) 验收过的同一份包;来源提交为 8ecada040db2c3ddf699d7a5bc1ddd86336b88fe,SHA-256 为 2a885d03f931505432b78424922c63e7ac75c70a10ab57b7c7503d059af7b627。npm 下载后再次核对一致。
12
+
13
+ - 六组原生平台安装、启动、浏览器和卸载,以及 GitHub 源码安装、固定 alpha 依赖图兼容检查全部通过;详见 Release 的 release-acceptance.json。
14
+ - 287 项组件测试通过;编辑器随包资源改为固定同源脚本加载,并验证在不允许 unsafe-eval 的浏览器策略下正常初始化和渲染 Markdown。
15
+ - 日常安装使用 npm latest;验收、兼容和回退保留精确版本。运行中不自动升级。宿主基线仍为 dsh 0.1.2-rc.1,Core 5.8.1 / contract 1。
16
+ - 真实模型验证 not-run,模型调用 0 次。不将静态扫描警告全部消除作为本次结论。
17
+
18
+ ## 0.2.8
19
+
20
+ [Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.8) 与 npm dsh-openwrite@0.2.8 的 SHA-256 均为 3a54f30fec03a5a64338f6cbc8216cafdc733cdf3622691fdbc8f029d78e4902。验收见 [CI](https://github.com/LiPu-jpg/Openwrite/actions/runs/34368570869):Intel 首次超时,未修改代码重跑通过;历史失败保留。npm 分发另在 macOS arm64 / Node 24 的隔离环境完成 25 项安装、运行、浏览器及卸载检查。真实模型验证 not-run。
21
+
22
+ ## 0.2.7 记录
2
23
 
3
24
  下载与最终结果以 [Release 附件](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.7) 的 `release-acceptance.json` 为准。报告绑定唯一 `.tgz` 的 SHA-256。失败、未运行、取消和跳过不计为通过;发布直接提升 CI 产物。不覆盖 `v0.2.6` / `v0.2.5` 附件。
4
25
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-openwrite",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "description": "OpenWrite 长篇小说领域后端接入 DeepSeek Harness:统一创作 Agent 预设 + 原生创作工作台",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -42,6 +42,7 @@ const WRITABLE_PATHS = new Set([
42
42
  'manuscript/acceptance/reconcile',
43
43
  'manuscript/acceptance/ack',
44
44
  'project/init',
45
+ 'project/metadata',
45
46
  'model',
46
47
  'model/test',
47
48
  'model/embedding/test',
@@ -1399,6 +1399,8 @@ export function registerNovelTools(ctx, clientFactory, options) {
1399
1399
  parameters: {
1400
1400
  novel_id: { type: 'string', required: true, description: 'Project id, e.g. "my_novel" (2-64 chars: letters, digits, "-", "_").' },
1401
1401
  title: { type: 'string', required: true, description: 'Book title (max 120 characters).' },
1402
+ author: { type: 'string', description: 'Author credit for delivery export (max 120 characters).' },
1403
+ language: { type: 'string', description: 'Book language tag, e.g. zh-CN or en (default zh-CN).' },
1402
1404
  project_path: { type: 'string', description: 'Target directory on the server; omit to use the server default location.' },
1403
1405
  template: { type: 'string', enum: ['default', 'demo_short'], description: 'Project template (default "default").' },
1404
1406
  },
@@ -1412,6 +1414,10 @@ export function registerNovelTools(ctx, clientFactory, options) {
1412
1414
  if (!args.title.trim() || args.title.length > 120)
1413
1415
  throw new Error('title must be non-empty and at most 120 characters');
1414
1416
  const body = { novel_id: args.novel_id, title: args.title };
1417
+ if (args.author !== undefined)
1418
+ body['author'] = args.author;
1419
+ if (args.language !== undefined)
1420
+ body['language'] = args.language;
1415
1421
  if (args.project_path !== undefined)
1416
1422
  body['project_path'] = args.project_path;
1417
1423
  if (args.template !== undefined)