dsh-openwrite 0.2.28 → 0.2.34
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/LICENSE +1 -1
- package/README.md +49 -8
- package/THIRD_PARTY_NOTICES.md +4 -3
- package/companions.mjs +508 -0
- package/cordis.patch.yml +0 -2
- package/docs/CLOSED_ISSUE_FOLLOWUPS.md +1 -1
- package/docs/COMPANION_PLUGINS.md +142 -0
- package/docs/CONTEXT_SLOTS.md +1 -1
- package/docs/COST_MEASUREMENT.md +2 -2
- package/docs/DEVELOPMENT.md +6 -11
- package/docs/DSH_STORE.md +14 -2
- package/docs/EDITOR_SAFETY_REPAIRS.md +2 -2
- package/docs/INSTALL.md +112 -4
- package/docs/ISSUES_121_123.md +4 -4
- package/docs/ISSUES_140_142.md +58 -0
- package/docs/ISSUES_149_150_151.md +77 -0
- package/docs/ISSUE_123_FOLLOWUP.md +3 -2
- package/docs/ISSUE_146_REVIEW_EVIDENCE.md +53 -0
- package/docs/LEARNING.md +1 -1
- package/docs/MOBILE_READINESS.md +62 -0
- package/docs/PLUGIN_MAINTENANCE.md +1 -3
- package/docs/RELEASE_ACCEPTANCE.md +20 -3
- package/docs/REVIEW_ROUND_22.md +67 -0
- package/docs/REVIEW_ROUND_23.md +48 -0
- package/docs/REVIEW_ROUND_25.md +51 -0
- package/docs/SELECTION_UPGRADE_REPAIRS.md +2 -2
- package/docs/TOOLS.md +181 -604
- package/docs/WORKFLOWS.md +5 -5
- package/package.json +17 -21
- package/packages/openwrite-bridge/lib/client.d.ts +0 -1
- package/packages/openwrite-bridge/lib/client.js +90 -9
- package/packages/openwrite-bridge/lib/contracts-generated.js +2 -1
- package/packages/openwrite-bridge/lib/dog-delivery.d.ts +1 -0
- package/packages/openwrite-bridge/lib/dog-delivery.js +3 -1
- package/packages/openwrite-bridge/lib/dog-review.js +15 -3
- package/packages/openwrite-bridge/lib/domain.d.ts +27 -0
- package/packages/openwrite-bridge/lib/domain.js +250 -29
- package/packages/openwrite-bridge/lib/host-llm.d.ts +188 -0
- package/packages/openwrite-bridge/lib/host-llm.js +657 -0
- package/packages/openwrite-bridge/lib/host-web.d.ts +61 -0
- package/packages/openwrite-bridge/lib/host-web.js +166 -0
- package/packages/openwrite-bridge/lib/index.d.ts +4 -0
- package/packages/openwrite-bridge/lib/index.js +150 -6
- package/packages/openwrite-bridge/lib/managed-runtime.d.ts +47 -2
- package/packages/openwrite-bridge/lib/managed-runtime.js +176 -34
- package/packages/openwrite-bridge/lib/tool-policy.js +37 -12
- package/packages/openwrite-bridge/lib/tools.js +1223 -1227
- package/packages/openwrite-bridge/package.json +7 -5
- package/packages/studio-panel/lib/client.js +123207 -121534
- package/packages/studio-panel/lib/client.js.map +1 -1
- package/packages/studio-panel/lib/types/client/LaunchOpenWrite.d.ts +10 -0
- package/packages/studio-panel/lib/types/client/ModelView.d.ts +28 -4
- package/packages/studio-panel/lib/types/client/OpenWriteSettings.d.ts +64 -0
- package/packages/studio-panel/lib/types/client/SceneWorkbench.d.ts +2 -0
- package/packages/studio-panel/lib/types/client/SearchSettings.d.ts +2 -0
- package/packages/studio-panel/lib/types/client/SerialWritingView.d.ts +2 -1
- package/packages/studio-panel/lib/types/client/TurnMutationSummary.d.ts +2 -0
- package/packages/studio-panel/lib/types/client/VditorBody.d.ts +1 -1
- package/packages/studio-panel/lib/types/client/api.d.ts +41 -2
- package/packages/studio-panel/lib/types/client/browser-download.d.ts +4 -0
- package/packages/studio-panel/lib/types/client/companions.d.ts +46 -0
- package/packages/studio-panel/lib/types/client/dto.d.ts +22 -0
- package/packages/studio-panel/lib/types/client/locales.d.ts +1 -1
- package/packages/studio-panel/lib/types/client/workspace-chrome.d.ts +41 -0
- package/packages/studio-panel/package.json +5 -3
- package/plugin.mjs +159 -20
- package/preset-definition.mjs +144 -4
- package/presets/openwrite/agent.cordis.yml +7 -9
- package/presets/openwrite/ops-integration.mjs +28 -0
- package/presets/openwrite/preset.yml +2 -1
- package/presets/openwrite/skills/canon/SKILL.md +3 -3
- package/presets/openwrite/skills/delivery-artifact-query/SKILL.md +41 -0
- package/presets/openwrite/skills/dialoguequality/SKILL.md +16 -17
- package/presets/openwrite/skills/dog-delivery-verification/SKILL.md +113 -0
- package/presets/openwrite/skills/export-book/SKILL.md +3 -3
- package/presets/openwrite/skills/foreshadow/SKILL.md +1 -1
- package/presets/openwrite/skills/foreshadowing-system/SKILL.md +16 -25
- package/presets/openwrite/skills/import-artifact-query/SKILL.md +30 -0
- package/presets/openwrite/skills/learn/SKILL.md +3 -3
- package/presets/openwrite/skills/novel-creator/SKILL.md +10 -10
- package/presets/openwrite/skills/novel-reviewer/SKILL.md +11 -11
- package/presets/openwrite/skills/progress/SKILL.md +1 -1
- package/presets/openwrite/skills/review-artifact-query/SKILL.md +41 -0
- package/presets/openwrite/skills/review-chapter/SKILL.md +2 -2
- package/presets/openwrite/skills/revise-span/SKILL.md +5 -5
- package/presets/openwrite/skills/style-system/SKILL.md +13 -6
- package/presets/openwrite/skills/truth-validation/SKILL.md +9 -12
- package/presets/openwrite/skills/workflow-manager/SKILL.md +13 -13
- package/presets/openwrite/skills/world-query/SKILL.md +16 -11
- package/presets/openwrite/skills/write-next/SKILL.md +1 -1
- package/release/{openwrite-5.8.20-py3-none-any.whl → openwrite-5.8.30-py3-none-any.whl} +0 -0
- package/release/runtime-manifest.json +4 -13
- package/release/source.json +21 -21
- package/release/wheels/licenses/OPENSSL-3.6.3-LICENSE.txt +225 -0
- package/scripts/maintenance.mjs +67 -7
- package/scripts/plugin-doctor.mjs +179 -0
- package/scripts/prepare.mjs +26 -4
- package/scripts/safe-upgrade.mjs +38 -5
- package/dog-tools.mjs +0 -13
- package/presets/openwrite/skills/dog-delivery-query/SKILL.md +0 -42
- package/presets/openwrite/skills/dog-import-query/SKILL.md +0 -29
- package/presets/openwrite/skills/dog-review-query/SKILL.md +0 -42
- package/scripts/dog/delivery-stage.js +0 -32
- package/scripts/dog/import-chapter.js +0 -20
- package/scripts/dog/import-record.js +0 -35
- package/scripts/dog/review-dimension.js +0 -41
- package/scripts/dog/review-record.js +0 -42
- package/vendor/dsh-dog/LICENSE +0 -29
- package/vendor/dsh-dog/README.md +0 -114
- package/vendor/dsh-dog/UPSTREAM.md +0 -30
- package/vendor/dsh-dog/cordis.patch.yml +0 -14
- package/vendor/dsh-dog/lib/client.js +0 -2960
- package/vendor/dsh-dog/lib/client.js.map +0 -1
- package/vendor/dsh-dog/lib/core--byUPJL8.js +0 -2191
- package/vendor/dsh-dog/lib/core-BiEBMLz3.d.ts +0 -495
- package/vendor/dsh-dog/lib/core.d.ts +0 -2
- package/vendor/dsh-dog/lib/core.js +0 -2
- package/vendor/dsh-dog/lib/index.d.ts +0 -143
- package/vendor/dsh-dog/lib/index.js +0 -1230
- package/vendor/dsh-dog/package.json +0 -110
- package/vendor/dsh-dog/schemas/schema-0.2/graph.schema.json +0 -139
- package/vendor/dsh-dog/schemas/schema-0.2/report.schema.json +0 -87
- package/vendor/dsh-dog/schemas/schema-0.2/run.schema.json +0 -259
- package/vendor/dsh-dog/schemas/schema-0.2/runtime-event.schema.json +0 -105
- package/vendor/dsh-dog/schemas/schema-0.2/verification.schema.json +0 -40
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
| #98.1 | 独立停机旁路升级工具已发布;宿主候选补丁通过 Windows/Linux 专项 CI。 | [fork PR #1](https://github.com/LiPu-jpg/deepseek-harness/pull/1) 尚未成为正式宿主;[上游讨论](https://github.com/deepseek-ai/deepseek-harness/discussions/10745) 继续跟踪。原生安装命令不受插件工具保护。 |
|
|
25
25
|
| #111 | 不支持平台返回明确错误并提供外部 Studio 配置;原报告接受此降级方向。 | Android/Termux 真机与外部 Studio 实测;当前没有 Android 原生运行时。 |
|
|
26
26
|
|
|
27
|
-
后续独立反馈 [#121](https://github.com/LiPu-jpg/Openwrite/issues/121)、[#122](https://github.com/LiPu-jpg/Openwrite/issues/122)
|
|
27
|
+
后续独立反馈 [#121](https://github.com/LiPu-jpg/Openwrite/issues/121)、[#122](https://github.com/LiPu-jpg/Openwrite/issues/122) 已修复、验收并合并关闭;修复已包含于正式 0.2.28。发行和关闭代码报告不代替上述两项外部条件。
|
|
28
28
|
|
|
29
29
|
## 后续关闭条件
|
|
30
30
|
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# 联动插件(Companion Plugins)
|
|
2
|
+
|
|
3
|
+
OpenWrite 不依赖任何联动插件:写作/审稿链路、工作台在单独安装时全部可用。
|
|
4
|
+
本节说明三个**可选**联动插件装上之后会发生什么、装上之前的差别,以及判定规则。
|
|
5
|
+
|
|
6
|
+
## 判定规则(重要)
|
|
7
|
+
|
|
8
|
+
联动是否生效由两部分决定,任一部份不满足都保持 OpenWrite 自己的实现:
|
|
9
|
+
|
|
10
|
+
1. **已安装**:插件出现在某个 profile 的 `dsh.profile.bundles` 里,并且其包目录真的存在于
|
|
11
|
+
`<DSH_HOME>/profiles/<profile>/node_modules/`。
|
|
12
|
+
2. **宿主放行**:该插件自己声明的 `peerDependencies["@deepseek-ai/dsh"]` 范围覆盖当前宿主版本。
|
|
13
|
+
宿主安装时用的就是这个范围,所以“声明不含当前宿主”的插件即使装了也不会被宿主加载,
|
|
14
|
+
OpenWrite 不会去替它加载。
|
|
15
|
+
|
|
16
|
+
判定结果写入 `<DSH_HOME>/openwrite/companions.json`(按 profile manifest 的 mtime 做指纹缓存),
|
|
17
|
+
只在 profile 变动或宿主版本变化时重新推导。任何读取失败都** fail-closed**:
|
|
18
|
+
保持内嵌实现,不影响启动与写作。
|
|
19
|
+
|
|
20
|
+
诊断可用 `npm run doctor`(末尾的 `companion plugins` 一行)或工作台启动器里的「联动插件」区;
|
|
21
|
+
需要显式指定宿主版本时可用环境变量 `OPENWRITE_HOST_VERSION`(诊断与测试用)。
|
|
22
|
+
|
|
23
|
+
宿主版本解析顺序:`OPENWRITE_HOST_VERSION` → profile 内安装的 `@deepseek-ai/dsh` →
|
|
24
|
+
本插件已解析到的 `@deepseek-ai/dsh-*` 子包(与宿主同版本发布)→ 当前进程入口。
|
|
25
|
+
解析不到时按未知处理,所有联动保持关闭。
|
|
26
|
+
|
|
27
|
+
## dsh-dog(DoG 独立验收)
|
|
28
|
+
|
|
29
|
+
- OpenWrite 从 0.2.29 起不再内置 DoG 引擎、调试器或 `dog_*` 工具,也不会自动运行第三方 verifier;
|
|
30
|
+
OpenWrite 自己的六域评审与交付闭环照常工作。
|
|
31
|
+
- 安装 `@dsh-external/dsh-dog` 且当前宿主放行时:它的 `dog_*` 工具在宿主层可见(OpenWrite 预设
|
|
32
|
+
的 Agent 也能调用),工作台「联动插件」区显示安装/放行状态。预设新增非斜杠技能
|
|
33
|
+
`dog-delivery-verification`:把当前章或整书的正文、最新评审与交付 preflight 证据写成
|
|
34
|
+
工作区内的不可变 handoff 包和 DoG 0.9 图,再由 Agent 调 `dog_validate`/`dog_create`/`dog_run`
|
|
35
|
+
做一次独立判断。技能要求先说明会产生模型调用并得到作者同意,且不直接改正文。
|
|
36
|
+
- **未安装**:写作、审稿、交付完全不受影响;Agent 不会声称跑过 DoG,回到 OpenWrite 门禁。
|
|
37
|
+
- OpenWrite 只提供 handoff 与流程,不替 dsh-dog 运行 verifier,也不把它的运行结果写进
|
|
38
|
+
OpenWrite 的 `data/dog/**` 交付产物;两者是不同引擎,不能互相冒充。图形化调试器仍由
|
|
39
|
+
dsh-dog 自己的面板提供,OpenWrite 不另建入口。
|
|
40
|
+
|
|
41
|
+
## dsh-ops(token 效率工具)
|
|
42
|
+
|
|
43
|
+
- 仓库:<https://github.com/T-Auto/dsh-ops>(npm 包名 `dsh-ops`,MIT)。
|
|
44
|
+
- 提供有界的 Native 文件工具、渐进式工具发现(`ops_discover_tools`)与诊断(`ops_status`)。
|
|
45
|
+
- **未安装**:预设工具面与现在完全相同。
|
|
46
|
+
- **已安装且宿主放行**:预设追加一行 `openwrite-ops`,调用上游
|
|
47
|
+
`integration({ preset: 'openwrite', files: true, discovery: true, presentation: 'native',
|
|
48
|
+
replaceOfficial: false, shell: false })`。也就是:只挂文件类常驻工具 + 渐进发现,
|
|
49
|
+
**不替换官方文件工具、不发布 `ops_bash`、不改提示词策略**。卸载该插件即恢复原状。
|
|
50
|
+
- 工作台「联动插件」区会把同一组选项交给上游 `resolveIntegrationConfig`,显示实际解析出的
|
|
51
|
+
文件工具/渐进发现/呈现方式/是否替换官方工具/shell 开关与常驻工具数;上游没有该导出时
|
|
52
|
+
退回一句概述,不把“探测到”说成“已按某个具体配置挂载”。
|
|
53
|
+
- 上游声明的宿主范围是 `>=0.2.0-rc.2 <0.2.2-0`,因此 0.1.x 宿主上不会挂载(上游 peer 也不允许)。
|
|
54
|
+
- 安装:`dsh plugin --profile web add dsh-ops`(或按该仓库说明使用其安装入口)。
|
|
55
|
+
|
|
56
|
+
> 上游文档中的 `preset` id 必须精确匹配 OpenWrite 的稳定预设 id `openwrite`;本插件传入的就是这个值。
|
|
57
|
+
> 挂载前还会真的 import 一次 `dsh-ops/integration` 并用上面这组选项构建集成:npm 上的 `0.4.4`
|
|
58
|
+
> 还没有这个导出(`0.5.0-alpha` 起才提供),探测会报「does not expose dsh-ops/integration」并不挂载,
|
|
59
|
+
> 避免一次导入失败把整个预设组合拖垮。
|
|
60
|
+
|
|
61
|
+
**宿主怎么判定兼容性(重要,曾判错)**:宿主读插件的 `engines.dsh`(没有则退回
|
|
62
|
+
`peerDependencies` 里的 `@deepseek-ai/dsh` 与 `@deepseek-ai/dsh-*`),用
|
|
63
|
+
`semver.satisfies(version, range, { includePrerelease: true })` 匹配。这个 `includePrerelease`
|
|
64
|
+
放宽了 npm 的规则,因此 `0.2.1-rc.5` **满足** `>=0.2.0-rc.2 <0.2.2-0`。
|
|
65
|
+
|
|
66
|
+
`companions.mjs` 曾按 npm 安装期的严格规则实现,于是比宿主更保守:在 `0.2.1-rc.5` 上把
|
|
67
|
+
`dsh-ops` 与 `dsh-our-free-model` 报成「已安装但宿主不放行」,而宿主实际两个都加载了
|
|
68
|
+
(读 `window.__DSH_BOOT__.entries` 实测确认)。已改为与宿主同一语义,并用一条测试把
|
|
69
|
+
`satisfiesRange` 与 semver 的 `includePrerelease` 结果逐组合钉住。
|
|
70
|
+
|
|
71
|
+
因此 `dsh-ops` 的宿主范围 `>=0.2.0-rc.2 <0.2.2-0` 覆盖全部 `0.2.x` 宿主,0.1.x 上不挂载
|
|
72
|
+
(上游 peer 也不允许)。上游若放宽或收紧声明,无需改代码,探测自动跟随。
|
|
73
|
+
|
|
74
|
+
> 上游文档中的 `preset` id 必须精确匹配 OpenWrite 的稳定预设 id `openwrite`;本插件传入的就是这个值。
|
|
75
|
+
> 挂载前还会真的 import 一次 `dsh-ops/integration` 并用上面这组选项构建集成:npm 上的 `0.4.4`
|
|
76
|
+
> 还没有这个导出(`0.5.0-alpha` 起才提供),探测会报「does not expose dsh-ops/integration」并不挂载,
|
|
77
|
+
> 避免一次导入失败把整个预设组合拖垮。
|
|
78
|
+
|
|
79
|
+
## dsh-our-free-model(免密钥模型车道)
|
|
80
|
+
|
|
81
|
+
- 仓库:<https://github.com/Ebony-Vinyl/dsh-our-free-model>(npm 包名
|
|
82
|
+
`@ebony-vinyl/dsh-our-free-model`,MIT;请勿安装 npm 上同名裸包)。
|
|
83
|
+
- 装上后宿主模型选择器会出现免费车道,无需登录/Key。
|
|
84
|
+
- **未安装**:OpenWrite 只在工作台「联动插件」区给出一句安装提示。
|
|
85
|
+
- **已安装**:同样只在「联动插件」区显示状态(版本、是否被当前宿主放行)。
|
|
86
|
+
- 该插件 2.7.4 声明的宿主范围是 `^0.1.2-rc.1 || ^0.1.7-rc.2 || ^0.2.0-rc.1`,
|
|
87
|
+
因此 `0.2.1-rc.*` 宿主上它自己也不会被宿主加载,联动区会如实显示「已安装但当前宿主不兼容」。
|
|
88
|
+
- **注意**:OpenWrite 的写作/审稿调用走 OpenWrite Core(Studio 后端)自己的模型配置,
|
|
89
|
+
不经过宿主 llm 服务。因此装上它**不会自动**成为 OpenWrite 的模型。
|
|
90
|
+
- 「联动插件」区在检测到本地转发已开启时提供一个「写入 OpenWrite 模型配置」按钮:
|
|
91
|
+
它读取该插件的 `/api/our-free-model/clients`(同一 origin),把 `base_url`/`api_key`/模型名
|
|
92
|
+
写成一条 id 为 `our-free-model` 的 OpenWrite 模型 profile。写入走 Studio 的
|
|
93
|
+
`POST /studio-panel/api/model/profiles`,与「任务 → 模型」页面同一条路由,由 Core 校验。
|
|
94
|
+
已存在同 id profile 时会先要求确认,并**保留作者调过的参数**(温度、上下文窗口、超时等),
|
|
95
|
+
只更新网关地址、模型与密钥;`remember_api_key` 沿用作者原来的选择,不默认代为持久化密钥。
|
|
96
|
+
该路由由第三方插件提供,其鉴权行为不在本插件控制范围内(见下「安全假设」)。
|
|
97
|
+
未开启本地转发时,按钮不出现,只提示去该插件的设置页打开。
|
|
98
|
+
接入动作现在会同时处理**任务路由**:读取全局模型库的 `routes`,显示“当前全局路由”,
|
|
99
|
+
默认勾选“同时把写作/评审切到该模型”。确认后先写 profile,再把 `chapter_write` 与 `review`
|
|
100
|
+
两个键切到 `our-free-model`;规划、检索、研究等其余路由原样保留。已存在 profile 或路由
|
|
101
|
+
将变化时都会二次确认;若 profile 写入成功而路由写入失败,提示会明确说“配置已写入、路由
|
|
102
|
+
切换失败”,不会把部分成功报成整体成功。
|
|
103
|
+
这里写的是**全局**路由;若当前作品在 `novel_config.yaml` 里单独设置了 `model_routes`,
|
|
104
|
+
作品设置优先,按钮不会覆盖它。网关地址若自带 `/v1`,写入前会规范化,避免 `/v1/v1`。
|
|
105
|
+
|
|
106
|
+
## 工作台里的「联动插件」区
|
|
107
|
+
|
|
108
|
+
「设置 → OpenWrite → 宿主」页的「联动插件」区展示三行状态:dsh-dog、dsh-ops、dsh-our-free-model(启动器底部入口复用同一份状态),
|
|
109
|
+
各自说明“已接入 / 已安装但宿主不兼容(原因)/ 未安装(装上会怎样)”。
|
|
110
|
+
状态数据来自 `/studio-panel/companions`(由本插件在宿主进程内探测,与其它
|
|
111
|
+
`/studio-panel/*` 路由一样受宿主浏览器鉴权保护);ops 行还会带上解析后的挂载计划。
|
|
112
|
+
|
|
113
|
+
该区域**不是**纯只读:免费模型的「写入 OpenWrite 模型配置」按钮会写一条模型 profile,
|
|
114
|
+
并可同时把全局写作/评审路由切到它(语义见上一节)。除此之外它不修改任何配置。
|
|
115
|
+
|
|
116
|
+
## 安全假设(需定期复核)
|
|
117
|
+
|
|
118
|
+
- `/studio-panel/companions` 的响应含宿主版本与联动插件清单,已按其它 `/studio-panel/*`
|
|
119
|
+
路由加同一道浏览器鉴权;无鉴权的本地请求会拿到 401/503 而不是数据。
|
|
120
|
+
- `/api/our-free-model/clients` 由第三方插件提供,本插件假设它与 Studio 路由一样受宿主
|
|
121
|
+
浏览器鉴权保护。该假设未被本插件验证,升级该插件后应重新确认;响应里的密钥只用于写入
|
|
122
|
+
模型 profile,不进入日志、诊断或错误信息。
|
|
123
|
+
|
|
124
|
+
## 维护约定
|
|
125
|
+
|
|
126
|
+
- 联动判定逻辑集中在根目录 `companions.mjs`(无第三方依赖,自带所需 semver 子集),
|
|
127
|
+
单测在 `scripts/companions.test.mjs`;ops 适配在 `presets/openwrite/ops-integration.mjs`;
|
|
128
|
+
DoG 交付验收流程在 `presets/openwrite/skills/dog-delivery-verification/SKILL.md`。
|
|
129
|
+
- 三个联动插件都保持“可选、fail-closed”:探测/导入失败只影响对应联动,不影响写作与启动。
|
|
130
|
+
- 任何联动插件都不要变成硬依赖:探测失败、范围不匹配、包缺失都必须回到 OpenWrite 自己的实现。
|
|
131
|
+
|
|
132
|
+
## 真实宿主验证记录(2026-10-31,macOS arm64 / Node v24.15,0 次模型调用)
|
|
133
|
+
|
|
134
|
+
| 场景 | 宿主 | 结果 |
|
|
135
|
+
| --- | --- | --- |
|
|
136
|
+
| 无联动插件(DoG 已移除) | `0.2.1-rc.3` / `0.2.1-rc.5` | 客户端验收全项通过;预设选择器只有 1 条 OpenWrite;工具面不再含 `dog_*` |
|
|
137
|
+
| dsh-ops `0.5.0-alpha3`(有 `./integration`) | `0.2.0-rc.2` | 探测为可用;客户端验收通过 |
|
|
138
|
+
| dsh-ops `0.4.4`(无 `./integration`) | `0.2.0-rc.2` | 探测报「does not expose dsh-ops/integration」并不挂载;预设组合不受影响,验收通过 |
|
|
139
|
+
| dsh-our-free-model `2.7.4` | `0.2.0-rc.2`(安装) | 安装后该插件自身的客户端引导未在本环境完成(其启动期网关探测),宿主本身无激活错误;OpenWrite 侧仅探测与展示,未参与该路径 |
|
|
140
|
+
|
|
141
|
+
未覆盖:三系统 CI、Windows/Ubuntu 实机、真实手机、真实付费模型、以及「ops 工具出现在真实 Agent 工具目录」
|
|
142
|
+
(本验收环境不发起 Agent 轮次,预设组合不会挂载;该链路由单测证明行已按精确 preset id 插入)。
|
package/docs/CONTEXT_SLOTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 写手上下文槽位参考
|
|
2
2
|
|
|
3
|
-
本表对应候选 Core 5.8.
|
|
3
|
+
本表对应候选 Core 5.8.30,来源提交 `82bae73fd2e1cab88dc05f36cc3945c2d6ee6756`。由捆绑 wheel 的 SECTION_SOURCES、保护规则和 shares 生成,共 20 个来源条目,包含兼容别名;不是每次写作都会装满这些槽位。
|
|
4
4
|
|
|
5
5
|
## 看本章实际用了什么
|
|
6
6
|
|
package/docs/COST_MEASUREMENT.md
CHANGED
|
@@ -11,7 +11,7 @@ npm --prefix packages/openwrite-bridge run build
|
|
|
11
11
|
node --test packages/openwrite-bridge/scripts/tool-policy.test.mjs
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
`real dsh tool registry isolates
|
|
14
|
+
`real dsh tool registry isolates 56 tools` 会打印两行 JSON:
|
|
15
15
|
|
|
16
16
|
| 字段 | 含义 | 不是什么 |
|
|
17
17
|
|---|---|---|
|
|
@@ -20,7 +20,7 @@ node --test packages/openwrite-bridge/scripts/tool-policy.test.mjs
|
|
|
20
20
|
| `sdkBytes` | 注入到 system prompt 的 SDK 文本字节 | 不是费用 |
|
|
21
21
|
| `tokenizer: not-measured` | 本仓库不内置某家 tokenizer | 不得改写成已测 token |
|
|
22
22
|
|
|
23
|
-
同一套检查还断言:普通预设 `novel_*` 为 0;创作预设为
|
|
23
|
+
同一套检查还断言:普通预设 `novel_*` 为 0;创作预设为 56 且不随 PTC 另一 scope 改变。
|
|
24
24
|
|
|
25
25
|
要对比「请求大小」,把一次真实 `tools.schemas(agent)` 或 PTC `wireSchemas` 的 JSON 写入文件后对体积做 `wc -c` / SHA-256。这仍是请求体字节,不是 token。
|
|
26
26
|
|
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
| 路径 | 说明 |
|
|
20
20
|
|---|---|
|
|
21
|
-
| `packages/openwrite-bridge/` | dsh 插件:
|
|
21
|
+
| `packages/openwrite-bridge/` | dsh 插件:56 个 `novel_*` 工具,覆盖 Studio HTTP 动作面并提供隔离模型横评与脱敏 trace |
|
|
22
22
|
| `packages/studio-panel/` | dsh web 原生工作台:创作 / 资料 / 任务,含规范章节导航、连续审读、场景双序、正文编辑器、双 DAG、模型测试台与工具卡 |
|
|
23
23
|
| `presets/openwrite/` | OpenWrite 全流程 agent 预设(规划/资产/写章/评审/修订) |
|
|
24
24
|
| `scripts/install.sh` | 构建插件、安装预设到 `~/.dsh/.agent-presets/`、插件装进 dsh profile |
|
|
@@ -52,14 +52,9 @@ npm run doctor -- --profiles # 只读核对本机 web/headless 是否链接
|
|
|
52
52
|
`check:plugin` 不需要服务、小说或模型凭据,GitHub Actions 也执行此门禁。
|
|
53
53
|
真实系统另跑 `scripts/verify.sh` 和 `npm run test:e2e`;E2E 跳过不算运行时通过。
|
|
54
54
|
|
|
55
|
-
##
|
|
55
|
+
## 评审/交付产物
|
|
56
56
|
|
|
57
|
-
`
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
安装器会在缺少 `dog:` 配置时写入安全兜底值。DoG v1.2 优先使用发起调用的 dsh 会话
|
|
63
|
-
Workspace,所以切换作品会自动切换评审/交付图根目录,无需修改 `workspaceRoot` 或重启。
|
|
64
|
-
`novel_review_chapter` 和后台章节评审完成时会自动实例化标准章节审稿 DAG;DoG 只查询
|
|
65
|
-
已物化产物,不会重复调用模型。
|
|
57
|
+
`novel_review_chapter` 和后台章节评审完成时会自动实例化标准章节审稿记录,
|
|
58
|
+
查询技能(`review-artifact-query` / `delivery-artifact-query` / `import-artifact-query`)
|
|
59
|
+
只读这些已物化产物,不会重复调用模型。0.2.29 起不再内置第三方 DoG 引擎,
|
|
60
|
+
需要图形化验证可自行安装 `@dsh-external/dsh-dog`。
|
package/docs/DSH_STORE.md
CHANGED
|
@@ -11,12 +11,22 @@ OpenWrite 是一个完整的小说创作插件套件。商城安装目标是仓
|
|
|
11
11
|
- manifestPath:`package.json`
|
|
12
12
|
- Bundle Patch:`cordis.patch.yml`
|
|
13
13
|
|
|
14
|
-
根包统一加载 `openwrite-bundle`、`openwrite-bridge`、`studio-panel
|
|
14
|
+
根包统一加载 `openwrite-bundle`、`openwrite-bridge`、`studio-panel`。这些既有 ID 保持稳定。`packages/openwrite-bridge`、`packages/studio-panel` 是内部开发包,不应和根包一起登记到同一个 Profile,也不需要删除它们或拆成独立商城条目。
|
|
15
15
|
|
|
16
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
|
## 0.2.26
|
|
19
19
|
|
|
20
|
+
### #142:商城仍选择 0.2.25
|
|
21
|
+
|
|
22
|
+
报告的实际命令是不带版本的 `dsh plugin --profile desktop add dsh-openwrite`,
|
|
23
|
+
被拒版本为 0.2.25。此版本确实没有声明 DSH 0.2.1-rc.3;0.2.26 起已加入,
|
|
24
|
+
已发布的 0.2.28 根包与所有内嵌子包继续覆盖该精确宿主。
|
|
25
|
+
安装入口应显式指定已经验收的版本或 `dsh-openwrite@latest`,避免旧的精确依赖选择被沿用。
|
|
26
|
+
最新 npm 元数据、profile 的 spec/锁和实际安装版本应分别核对,不能只修改商城展示字段。
|
|
27
|
+
当前不能仅凭日志认定报告者的具体缓存来源;排查和停机升级步骤见
|
|
28
|
+
[Stale package selection](INSTALL.md#stale-package-selection)。
|
|
29
|
+
|
|
20
30
|
0.2.26 在根包及全部内嵌子包加入精确 `0.2.1-rc.3` 声明,真实 Web 客户端验收通过。
|
|
21
31
|
市场请按实际 npm/Release 制品及其验收报告记录版本和兼容信息。
|
|
22
32
|
验证范围见 [#105–#113 修复说明](ISSUES_105_113.md)。
|
|
@@ -29,7 +39,9 @@ OpenWrite 是一个完整的小说创作插件套件。商城安装目标是仓
|
|
|
29
39
|
|
|
30
40
|
alpha 浏览器验收进一步发现 persona 配置由 `text` 改成了必填 `prefix`;预设使用 YAML 锚点将同一份身份文本提供给两个字段,并以两版实际 Config / apply 验证身份只注册一次。
|
|
31
41
|
|
|
32
|
-
构建基线仍是 `0.1.2-rc.1`。兼容声明覆盖精确版本 `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.2.0-rc.2`、`0.2.1-rc.2`、`0.2.1-rc.3`,并分别保留已完成的 Web 客户端验收;`0.1.3-alpha.1`、`0.1.3-alpha.2` 保持未知。这不自动升级用户宿主,也不承诺整个 alpha 或 0.2 范围都兼容。`0.2.23` 已发布到 npm `latest` 与 GitHub Release,完整平台矩阵、源码安装和四份宿主客户端报告见[发布验收](RELEASE_ACCEPTANCE.md#023);本机另复验了 `0.2.1-rc.2`
|
|
42
|
+
构建基线仍是 `0.1.2-rc.1`。兼容声明覆盖精确版本 `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.2.0-rc.2`、`0.2.1-rc.2`、`0.2.1-rc.3`、`0.2.1-rc.4`、`0.2.1-rc.5`,并分别保留已完成的 Web 客户端验收;`0.1.3-alpha.1`、`0.1.3-alpha.2` 保持未知。这不自动升级用户宿主,也不承诺整个 alpha 或 0.2 范围都兼容。`0.2.23` 已发布到 npm `latest` 与 GitHub Release,完整平台矩阵、源码安装和四份宿主客户端报告见[发布验收](RELEASE_ACCEPTANCE.md#023);本机另复验了 `0.2.1-rc.2` 的安装闸门、客户端激活、预设选择、工作台入口与三页签及其他插件共存。内置 DoG 引擎已移除(见 README),需要图形化 DoG 验证可自行安装 `@dsh-external/dsh-dog`。
|
|
43
|
+
|
|
44
|
+
`0.2.1-rc.4` 与 `0.2.1-rc.5` 于 0.2.29 候选加入声明:此前 `dsh plugin add dsh-openwrite` 在这两个宿主上直接被版本闸门拒绝([#150](https://github.com/LiPu-jpg/Openwrite/issues/150)/[#151](https://github.com/LiPu-jpg/Openwrite/issues/151)/[#142](https://github.com/LiPu-jpg/Openwrite/issues/142))。两个宿主各用官方 registry 的精确包完成安装闸门、客户端激活、预设选择、工作台三页签及其他插件共存验证,方法与边界见 [#149/#150/#151 修复说明](ISSUES_149_150_151.md)。已发布版本(含 `0.2.28`)不追溯补声明,需要这两个宿主的用户应等 `0.2.29` 正式发布。
|
|
33
45
|
|
|
34
46
|
2026-09-09,从官方 npm Registry 直接安装 `@deepseek-ai/dsh@0.1.5-alpha.1` 时,上游范围依赖选中了正在发布的 alpha.2,其中 `@deepseek-ai/dsh-tool-pwsh-persistent@^0.1.5-alpha.2` 当时缺失,安装失败(ETARGET)。兼容测试使用 npm 的 `--before=2026-09-09T00:00:00Z` 解析 alpha.1 发布时的依赖,并保留解析锁。没有修改官方包源码或用 replacements/overrides 冒充官方组件。此证据仅适用于报告中的宿主依赖图,不代表后续浮动依赖安装也通过。
|
|
35
47
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 正文编辑与审稿选区补修
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
0.2.28 / Core 5.8.20 已正式发布,见[发布验收](RELEASE_ACCEPTANCE.md)。原先 22 项检查没有覆盖编辑器延迟回调、审稿选区上限与真实 Markdown 序列化;本轮三项均先复现,再修复并增加行为回归。
|
|
4
4
|
|
|
5
5
|
| 缺口 | 修复后行为 | 验证 |
|
|
6
6
|
| --- | --- | --- |
|
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
|
|
15
15
|
本地 Core 1550 passed / 32 skipped,真实 HTTP 14 passed,界面 336 passed,managed 34 passed,完整插件检查通过。Core wheel 的 499 个运行时源文件逐字节一致,163 个应打包 Python 文件无遗漏。原生安装矩阵额外对同一候选 tarball 中的真实 Vditor/独立编辑器和两端映射器运行 9 组场景,结果写入每份原生报告的 editorSerialization 字段。
|
|
16
16
|
|
|
17
|
-
测试不调用付费模型,不写作者作品或真实 profile。最终跨平台回执见[发布验收](RELEASE_ACCEPTANCE.md)。#123 的宿主正式发布和 Android/Termux
|
|
17
|
+
测试不调用付费模型,不写作者作品或真实 profile。最终跨平台回执见[发布验收](RELEASE_ACCEPTANCE.md)。#123 的宿主正式发布和 Android/Termux 真机验收仍保留,本次发行不将这两项标记完成。
|
package/docs/INSTALL.md
CHANGED
|
@@ -45,7 +45,7 @@ dsh 对话模型在宿主中配置。小说生成、评审与测试模型在「
|
|
|
45
45
|
依赖包要求 Apple Silicon Mac 至少 macOS 14,Intel Mac 至少 macOS 13;
|
|
46
46
|
其他系统小版本的覆盖范围以 Release 报告为准。
|
|
47
47
|
|
|
48
|
-
- 插件装在指定 profile。bridge、panel
|
|
48
|
+
- 插件装在指定 profile。bridge、panel、技能、编辑器资源和 Core wheel 位于同一包。
|
|
49
49
|
- `$DSH_HOME/openwrite/` 保存下载缓存、Python 环境、管理记录、隔离配置与凭据;未指定 DSH_HOME 时使用 dsh 默认目录。
|
|
50
50
|
- 作品保存在作者选定目录。受管理 Core 仅监听回环地址,端口自动分配,实例认证只在宿主与 Core 之间传递。
|
|
51
51
|
- 只启动、停止本插件创建的进程。不修改系统 Python、全局 PATH 或 Shell 配置。
|
|
@@ -101,12 +101,52 @@ dsh plugin --profile web remove -w dsh-openwrite
|
|
|
101
101
|
|
|
102
102
|
## 自定义预设和高级配置
|
|
103
103
|
|
|
104
|
-
自定义预设从官方版本复制,目录 ID 使用 `openwrite-` 前缀以启用创作界面。小说工具行是 `dsh-openwrite/tools
|
|
104
|
+
自定义预设从官方版本复制,目录 ID 使用 `openwrite-` 前缀以启用创作界面。小说工具行是 `dsh-openwrite/tools`;不要再次注册全局 bridge。工具集合随会话预设保持稳定,不随界面切换。
|
|
105
105
|
|
|
106
106
|
小说工具支持 `presentation: native`(默认)、`ptc` 或 `both`。只读策略和计划模式独立约束副作用。模型服务商已接收的请求可能无法撤回:取消后停止新调度和重试,保存已完成结果与用量;费用未知时显示未知,不计为零。
|
|
107
107
|
|
|
108
108
|
bridge 的高级 `mode: external` / `baseUrl` 配置继续支持外部 Core,不接管外部进程。默认 `managed` 不需要配置端口。旧显式地址配置仍按外部模式解释。
|
|
109
109
|
|
|
110
|
+
### Bring your own Python
|
|
111
|
+
|
|
112
|
+
以下配置从 **0.2.29 候选版**提供,尚未发布;0.2.28 及更早版本请使用下节的 external 模式。
|
|
113
|
+
|
|
114
|
+
已有 Python **3.10 或更高版本**及所需依赖时,可以在当前 profile 的 `cordis.patch.yml`
|
|
115
|
+
修改已有 `openwrite-bridge` 行的配置:
|
|
116
|
+
|
|
117
|
+
```yaml
|
|
118
|
+
config:
|
|
119
|
+
mode: managed
|
|
120
|
+
pythonPath: /absolute/path/to/python3
|
|
121
|
+
# 依赖已安装在这个解释器的 site-packages 时,无须此项。
|
|
122
|
+
# Android 手工准备的 pyroot 可显式列出;路径必须是绝对目录。
|
|
123
|
+
pythonModulePaths:
|
|
124
|
+
- /absolute/path/to/pyroot
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
也可以在启动 dsh 的进程环境中设置 `OPENWRITE_PYTHON`,值为解释器的绝对路径,不能附带命令参数;
|
|
128
|
+
显式 `pythonPath` 优先。桌面应用须从继承该变量的环境启动,也可直接使用上面的 profile 配置。
|
|
129
|
+
`pythonModulePaths` 只在选定自备解释器后生效;external 模式继续由作者管理服务端。
|
|
130
|
+
|
|
131
|
+
此路径不下载 uv 或 python-build-standalone,不执行 pip,也不安装或升级作者的依赖。
|
|
132
|
+
插件校验随包 Core wheel 后,将其解包到自己的环境目录,使用所选解释器启动这一份 Core,
|
|
133
|
+
无需作者另外安装相同版本的 `openwrite`。解释器和显式依赖目录加入环境标识,不会误用托管 Python 的缓存。
|
|
134
|
+
运行时保留 `-I` 隔离和 UTF-8,使用 `-B` 禁止写入依赖目录的字节码;不继承 `PYTHONPATH`,
|
|
135
|
+
需要额外依赖目录时使用 `pythonModulePaths`。Core 路径排在显式依赖目录之前。
|
|
136
|
+
共享构建需要的 `LD_LIBRARY_PATH` / `DYLD_LIBRARY_PATH` / `DYLD_FALLBACK_LIBRARY_PATH`
|
|
137
|
+
在此模式下从宿主传入;应选择可以用 `-I` 正常启动的解释器,不依赖 `PYTHONHOME` 或隐式用户 site。
|
|
138
|
+
|
|
139
|
+
依赖须与随包 Core 的 wheel `METADATA` 相容,包括 pydantic 及与 Python/系统 ABI 对应的
|
|
140
|
+
pydantic-core、PyYAML、httpx、Markdown-it-py 和需要使用的模型客户端等。
|
|
141
|
+
桌面 Python 3.12 可在作者自己创建的 venv 中,使用随包的 `release/requirements.lock`
|
|
142
|
+
与 `release/wheels/` 准备依赖;该锁文件的桌面二进制轮子不能直接套用到 Android Python 3.14。
|
|
143
|
+
Android 的原生依赖由宿主或作者编译、提供,插件不会尝试安装 glibc 轮子来替代 bionic 产物。
|
|
144
|
+
|
|
145
|
+
每次启动都会在所选解释器中检查 Python 版本、Core 导入和 API 版本;失败给出缺失依赖等诊断,
|
|
146
|
+
不回退到运行时下载,不替换旧活动记录。健康检查成功后才标记就绪。进程鉴权、随机端口、
|
|
147
|
+
取消、有限自动重启和卸载清理沿用托管模式;重启不重放写作或其他付费请求。
|
|
148
|
+
通过启动检查只说明 Studio 启动链可用,各模型及原生依赖功能仍需分别验证。
|
|
149
|
+
|
|
110
150
|
### External Studio
|
|
111
151
|
|
|
112
152
|
Android / Termux(bionic)和未列入 runtime manifest 的 ARM Linux 无托管 Python/ONNX 产物。
|
|
@@ -127,6 +167,47 @@ config:
|
|
|
127
167
|
提供,勿贴入 issue。作品目录必须在 Studio 所在机器上存在,Workspace 路径也须与服务端
|
|
128
168
|
一致,插件不会同步手机与电脑的文件。重启 dsh 后生效;外部进程由作者管理。
|
|
129
169
|
|
|
170
|
+
#### iPhone / iPad
|
|
171
|
+
|
|
172
|
+
iOS 可用浏览器访问电脑托管的 DSH Web 工作台或独立 Studio;电脑保持运行,并提供受信任且有访问控制的网络入口。
|
|
173
|
+
手机上的 `127.0.0.1` 只访问手机自身,不能沿用电脑的回环地址。本项目没有 iOS 本地 Python 后端。
|
|
174
|
+
候选 0.2.29 的开发范围、自动回归与待做的真机项目见 [手机验收说明](MOBILE_READINESS.md)。
|
|
175
|
+
|
|
176
|
+
#### Android / Termux
|
|
177
|
+
|
|
178
|
+
可以连接受信任的电脑,也可以在手机已有 Python 的环境中自行启动 Studio。
|
|
179
|
+
两者均使用上面的 external 配置,不要求插件下载 Android Python。
|
|
180
|
+
Termux 使用其自身的 Python 包;DSH Mobile 的 Python 扩展应使用该宿主提供的实际解释器路径。
|
|
181
|
+
不同发行方的路径、Python ABI 和依赖产物不能互换。
|
|
182
|
+
|
|
183
|
+
[#140](https://github.com/LiPu-jpg/Openwrite/issues/140) 的报告者提供了 Android/aarch64/bionic、
|
|
184
|
+
宿主 Python 3.14.8、pydantic 2.14.1 + 自编译 pydantic-core 2.50.1 的记录:
|
|
185
|
+
插件 0.2.26 所含 Studio 启动成功,`GET /` 返回 200。
|
|
186
|
+
这是一份第三方启动验证,不代表 0.2.28 或候选 0.2.29 已通过手机端完整工具验收。
|
|
187
|
+
|
|
188
|
+
可按以下目录约定准备;命令在解压 Release 后的工作目录执行:
|
|
189
|
+
|
|
190
|
+
1. 从 `package/release/runtime-manifest.json` 找到 `wheel.file`,用 Python 标准库解压到 `app/`。
|
|
191
|
+
例如,0.2.28 的 Core 是 `python3 -m zipfile -e package/release/openwrite-5.8.20-py3-none-any.whl app`。
|
|
192
|
+
2. 在选定 Python 的 site-packages 或独立 `pyroot/` 中准备相容依赖。
|
|
193
|
+
pydantic-core 需要与解释器及 Android ABI 匹配;报告者使用 Rust/clang 本地构建。
|
|
194
|
+
其他原生依赖也可能需要对应构建,不能将 Linux/glibc 轮子直接改名使用。
|
|
195
|
+
3. 如果使用独立 `pyroot/`,在手机 shell 中以前台进程启动:
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
PYTHONPATH="$PWD/pyroot:$PWD/app" python3 -m tools.cli studio --port 4567
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
4. 确认 `http://127.0.0.1:4567/` 可以打开,再将当前 profile 的已有 bridge 行设为
|
|
202
|
+
`mode: external`、`baseUrl: http://127.0.0.1:4567`。此地址仅适用于 Studio 和 dsh
|
|
203
|
+
在同一设备的情况;跨设备使用受信任的私网或 SSH 隧道。
|
|
204
|
+
5. 重启 dsh 后,继续验证 OpenWrite 面板、Workspace 路径绑定、实际文件工具和服务端鉴权。
|
|
205
|
+
`GET /` 返回 200 不能代替这些检查。候选 0.2.29 也可改用上节的自备 Python 模式,
|
|
206
|
+
把该 `pyroot` 绝对目录放入 `pythonModulePaths`,由插件负责启动和停止。
|
|
207
|
+
|
|
208
|
+
没有 fastembed/ONNX 等可选语义依赖时,部分检索会降级,不能据此承诺所有模型、
|
|
209
|
+
Embedding 或语义检索功能可用。平台 manifest 仍只列官方托管产物,不宣称提供 Android 原生构建。
|
|
210
|
+
|
|
130
211
|
## GitHub 源码安装
|
|
131
212
|
|
|
132
213
|
源码安装使用 dsh 官方 GitHub source 机制:`dsh plugin --profile web add -w github:LiPu-jpg/Openwrite#v0.2.8`。仓库 `prepare` 自行构建三个插件,Core wheel 随固定提交提供,不访问相邻工作区。源码安装需要 Git 和构建依赖;建议普通用户优先使用已验收 Release 包。
|
|
@@ -143,12 +224,39 @@ config:
|
|
|
143
224
|
|
|
144
225
|
反馈请提供宿主版本、系统与架构、Release 版本、安装阶段及脱敏错误。来源、许可证和校验值见 Release 附件及包内 `release/`。不要提交 API Key、浏览器登录 URL 或作品全文。
|
|
145
226
|
|
|
227
|
+
### Stale package selection
|
|
228
|
+
|
|
229
|
+
如果宿主是 `0.2.1-rc.3`,错误却显示 `dsh-openwrite@0.2.25` 不兼容,先确认实际选择的包版本。
|
|
230
|
+
0.2.25 未声明该宿主;0.2.26 起根包和全部内嵌子包已声明精确支持,0.2.28 继续包含对应验收。
|
|
231
|
+
不要给旧包添加版本豁免来掩盖取包问题。
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
npm view dsh-openwrite@latest version peerDependencies --registry=https://registry.npmjs.org
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
对照当前 profile 的 `package.json`、`pnpm-lock.yaml` 和已安装包的 `package.json`。
|
|
238
|
+
不带版本的 `add dsh-openwrite` 可能沿用已有精确依赖;显式 `@latest` 或精确版本才清楚表达升级意图。
|
|
239
|
+
商城显示的目录版本也不能替代 npm 实际解析结果。仅凭 #142 的报错不能确定用户侧是哪份锁或缓存。
|
|
240
|
+
|
|
241
|
+
完全退出 dsh/Desktop(含托盘)、备份 profile 后,优先使用已验收 Release 包的停机升级工具:
|
|
242
|
+
|
|
243
|
+
```sh
|
|
244
|
+
node package/scripts/safe-upgrade.mjs --profile desktop --package dsh-openwrite@0.2.28
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
该例固定到已发布的 0.2.28;更新版本须先确认其验收结果。源码安装、tarball 和自定义 registry
|
|
248
|
+
按各自来源排查,不直接清空整个 pnpm store 或删除 profile。停机升级工具失败会保留旧环境与日志。
|
|
249
|
+
0.2.29 候选的 `maintenance.mjs doctor --profile desktop` 会另外显示请求 spec、实际已装版本及诊断工具版本,
|
|
250
|
+
其停机升级工具也会把裸包名规范成 `dsh-openwrite@latest`;指定精确版本和本地 tarball 不受影响。
|
|
251
|
+
|
|
146
252
|
## dsh 0.2 客户端兼容排查
|
|
147
253
|
|
|
148
254
|
`dsh-openwrite@0.2.10` 的旧工作台按 0.1 接口构建,不能通过版本豁免获得 0.2.0-rc.2 的客户端兼容性。根包豁免不覆盖内嵌子包:`@dsh-novel/studio-panel@<ver>`、`@dsh-external/dsh-dog@<ver>` 各自经过宿主版本检查。优先升级到包含 #45 修复的包;修复后的精确 `0.2.0-rc.2` 声明覆盖根包和所有子包,不需要手工编辑 `compatibility.json`。
|
|
149
255
|
|
|
150
256
|
`dsh-openwrite@0.2.23` 起,根包和全部内嵌子包的声明同时覆盖精确宿主 `0.2.1-rc.2`,安装和激活不需要版本豁免。宿主判断的是 `package.json` 的 `peerDependencies`(`@deepseek-ai/dsh-*`),不是 `dsh.compatibility` 字段;因此只改 `dsh.compatibility` 字符串并不能让 0.2.22 在 0.2.1-rc.2 上加载。若安装日志出现 `plugin does not support the DSH version in use`,请直接升级到 `0.2.23` 或更高的已验收版本,不要手工改版本号或给旧子包授权。本版已在 `0.2.1-rc.2` 完成 Web 启动、OpenWrite 入口、工作台三页签、DoG 面板与其他插件共存的验证;`0.1.2-rc.1`、`0.2.0-rc.2` 回归通过,Windows Electron 桌面端仍未实机复测。
|
|
151
257
|
|
|
258
|
+
`0.2.29` 候选起,声明同时覆盖精确宿主 `0.2.1-rc.4` 与 `0.2.1-rc.5`;这两个宿主上 `0.2.28` 及更早版本会被同一闸门拒绝([#150](https://github.com/LiPu-jpg/Openwrite/issues/150)/[#151](https://github.com/LiPu-jpg/Openwrite/issues/151)/[#142](https://github.com/LiPu-jpg/Openwrite/issues/142))。已发布版本不追溯补声明,遇到该错误请升级到声明覆盖该宿主的版本,方法与边界见 [#149/#150/#151 修复说明](ISSUES_149_150_151.md)。
|
|
259
|
+
|
|
152
260
|
本修复同时处理 `conversation.chat.turnTail` 从 chain 到 list 的变化,以及 `uiSession.pendingInteractions` 到 `uiSession.sessionStatus` 的变化。客户端初始化或延迟槽位注册失败时,插件回滚对应注册并在浏览器控制台输出 `[OpenWrite/Studio]` / `[OpenWrite/DoG]` 和原始异常,避免让这类插件初始化异常升级为宿主 web boot 失败。此修复不更改桌面端自身的 profile 恢复策略。
|
|
153
261
|
|
|
154
262
|
如果旧版本已经触发桌面端恢复,关闭桌面端后备份整个 profile,找到恢复前的 `cordis.patch.yml.bak-*`,恢复 patch 和原 `package.json` 中的 `dsh.profile.bundles`。这两项需一起核对,才能重新加载其他插件。保留已安装依赖和作品目录,不要用空 profile 替换完整配置。
|
|
@@ -162,7 +270,7 @@ node scripts/client-boot-smoke.mjs --host-cli=/absolute/path/to/dsh-0.2.0-rc.2/n
|
|
|
162
270
|
node scripts/client-boot-smoke.mjs dsh-openwrite-<version>.tgz --host-cli=/absolute/path/to/dsh-0.2.1-rc.2/node_modules/@deepseek-ai/dsh/lib/bin.js
|
|
163
271
|
```
|
|
164
272
|
|
|
165
|
-
脚本需要 Playwright Chromium,创建临时 Web profile
|
|
273
|
+
脚本需要 Playwright Chromium,创建临时 Web profile,检查无豁免版本闸门、客户端加载、真实预设选择、会话导航、三个工作台页签出现和创作视图激活、预设选择器不出现重复别名及其他插件共存,后端就绪与未初始化响应由测试夹具提供,不准备 Python 环境、不调用模型;实际安装与后端动作由独立发布验收覆盖。它验证 Web 客户端兼容性;Windows Electron 的原生启动和恢复流程仍须在对应平台完成发布验收。
|
|
166
274
|
|
|
167
275
|
## 0.2.12 的预设与审读修复
|
|
168
276
|
|
|
@@ -172,6 +280,6 @@ node scripts/client-boot-smoke.mjs dsh-openwrite-<version>.tgz --host-cli=/absol
|
|
|
172
280
|
|
|
173
281
|
## 作品信息与推理模型预算
|
|
174
282
|
|
|
175
|
-
在「任务 → 导入与导出 → 编辑作品信息」填写或修改书名、作者署名和语言。旧作品也可补齐作者,无需手工编辑配置文件。保存冲突时保留输入;请取消编辑并重新载入最新信息后再修改。未填写作者仍不能进行交付导出。`
|
|
283
|
+
在「任务 → 导入与导出 → 编辑作品信息」填写或修改书名、作者署名和语言。旧作品也可补齐作者,无需手工编辑配置文件。保存冲突时保留输入;请取消编辑并重新载入最新信息后再修改。未填写作者仍不能进行交付导出。`novel_project(action="init")` 也支持可选 `author` 与 `language`。
|
|
176
284
|
|
|
177
285
|
写章、事实提取和状态结算(包括重试)统一使用「任务 → 模型」中所选模型的输出 token 预算,不再在非创作阶段偷偷降到 4096/8192。推理模型的隐藏推理通常也占用输出额度:若仍出现截断,请在服务商允许的范围内提高所选模型的输出预算(例如 32768 或 49152),同时核对上下文窗口。正文目标字数与 token 预算是两回事;较高上限不等于一定消耗该数量,也不能保证所有模型都支持它。此次验证使用模型替身,未进行真实模型计费测试。
|
package/docs/ISSUES_121_123.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# #121–#123 与 #128
|
|
1
|
+
# #121–#123 与 #128 修复验证记录(已合并,随 0.2.28 发布)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本轮按“先修能修的”处理。以下代码已包含于正式 0.2.28(最终 Core 5.8.20);下方早期 Core 5.8.17 产物与验证记录保留为形成过程证据,未单独发行。
|
|
4
4
|
没有原始复现、没有设备或仍依赖上游的项目继续保留,不能用自动测试代替这些证据。
|
|
5
5
|
|
|
6
6
|
## 修复范围
|
|
@@ -85,7 +85,7 @@ outline_extra_keys:
|
|
|
85
85
|
|
|
86
86
|
本轮 Go 快速审稿先遇到本机 CLI 凭据读取错误,排查后四次流式请求成功、无服务商错误;所选范围通过,整章交付仍按部分审稿保持未定论,作品文件未改变。提供方未返回 token/费用明细,不将零占位计为已知账单。该实测发生于 `61c3f68`,之后完善审稿诊断与 Windows 文件处理,模型请求协议未改动。另一次 Go 取消验收使用的流处理模块与最终冻结提交逐文件哈希一致,已确认 HTTP 连接关闭。
|
|
87
87
|
|
|
88
|
-
#121/#122
|
|
88
|
+
#121/#122 的报告条目已修复、验收并合并,现已关闭。代码已随 0.2.28 发行;以下原场景验证与外部依赖继续独立跟踪。
|
|
89
89
|
|
|
90
90
|
[#123](https://github.com/LiPu-jpg/Openwrite/issues/123) 继续跟踪:
|
|
91
91
|
|
|
@@ -94,4 +94,4 @@ outline_extra_keys:
|
|
|
94
94
|
- #109 B-13 已由报告者确认行中 `>` 与混合行尾锚点的 [Windows 实测通过](https://github.com/LiPu-jpg/Openwrite/issues/123#issuecomment-6423904648),本项验收完成。
|
|
95
95
|
- #111 Android/Termux 真机及外部 Studio 验收;没有 Android 原生运行时。
|
|
96
96
|
|
|
97
|
-
此前缺少材料时保留四项;报告者新回复已补齐其中两项,现只保留宿主正式发布及 Android/Termux 实机两项。回复中新发现的代码问题另见 [补修记录](ISSUE_123_FOLLOWUP.md)
|
|
97
|
+
此前缺少材料时保留四项;报告者新回复已补齐其中两项,现只保留宿主正式发布及 Android/Termux 实机两项。回复中新发现的代码问题另见 [补修记录](ISSUE_123_FOLLOWUP.md),本阶段候选未单独发行,代码已纳入正式 0.2.28(最终 Core 5.8.20)。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# #140 / #142 跟进:自备 Python 与旧包选择
|
|
2
|
+
|
|
3
|
+
目标版本为 **0.2.29 候选**,尚未发布。Core 保持已验收的 5.8.20,wheel 字节及来源提交不变。
|
|
4
|
+
|
|
5
|
+
## #140:自备 Python
|
|
6
|
+
|
|
7
|
+
在 managed 模式增加 `pythonPath`,或通过 `OPENWRITE_PYTHON` 选择解释器;显式配置优先。
|
|
8
|
+
可用 `pythonModulePaths` 列出作者准备的依赖目录,对应报告中的 Android `pyroot`。
|
|
9
|
+
选定解释器后,即使 manifest 没有当前平台,也不会下载 uv 或 python-build-standalone。
|
|
10
|
+
|
|
11
|
+
插件校验随包 Core/依赖清单,将纯 Python Core wheel 解包到自己的环境目录,
|
|
12
|
+
用所选解释器导入检查 Python >=3.10、Core 和 API 版本,再启动已有的 stdio 鉴权后端。
|
|
13
|
+
不执行 pip、不自动解析依赖、不修改作者解释器;显式依赖目录与解释器路径参与缓存标识。
|
|
14
|
+
`-I` 隔离、UTF-8 和 `-B` 禁止字节码写入同时生效。
|
|
15
|
+
共享构建的原生库搜索路径仅在自备解释器模式下传入;凭据仍按原有环境白名单过滤。
|
|
16
|
+
|
|
17
|
+
依赖缺失或不匹配时给出诊断,保留旧 active 记录,不回退到隐式下载。
|
|
18
|
+
每次使用已有环境启动前也重做导入检查,以免作者改动依赖后仍把旧缓存当成可用环境。
|
|
19
|
+
启动后的鉴权、随机端口、健康检查、取消、重启上限和 owned-process 清理继续使用原有生命周期。
|
|
20
|
+
|
|
21
|
+
真实 Python 的 7 项新增集成覆盖:启动/鉴权/恢复及依赖目录不写入;缺依赖与旧环境保留;
|
|
22
|
+
缓存环境重新检查;Core 版本不匹配;环境变量与配置优先级;绝对路径校验;安装取消。
|
|
23
|
+
完整 managed 工具与生命周期测试本地 **41 passed / 0 skipped**。
|
|
24
|
+
真实随包 Core 5.8.20 的健康接口、鉴权和 Studio 静态资源另通过本地自备解释器验收;
|
|
25
|
+
相同验收加入正式安装矩阵,新增集成测试也对确切 tarball 内代码执行。
|
|
26
|
+
|
|
27
|
+
## #142:旧包选择
|
|
28
|
+
|
|
29
|
+
报告环境是 DSH 0.2.1-rc.3;实际报错版本为 OpenWrite 0.2.25。
|
|
30
|
+
0.2.25 的 peer 声明确实不覆盖该宿主。官方 npm 当前 latest 0.2.28 的根包及三个内嵌子包
|
|
31
|
+
均声明精确支持 0.2.1-rc.3;不能把旧包拒绝诊断改成放宽新包兼容范围。
|
|
32
|
+
|
|
33
|
+
使用本地模拟 registry、真实 pnpm 和隔离 profile,构造 0.2.25 精确依赖、registry latest 0.2.28:
|
|
34
|
+
|
|
35
|
+
| 操作 | 结果 |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| install 初始精确依赖 | 0.2.25 |
|
|
38
|
+
| add dsh-openwrite | 仍为 0.2.25 |
|
|
39
|
+
| add dsh-openwrite@latest | 0.2.28 |
|
|
40
|
+
|
|
41
|
+
这证明一种能导致相同错误的旧包选择条件;报告者具体的 spec/锁/registry 缓存仍需原场景确认。
|
|
42
|
+
商城本身属于外部项目,OpenWrite 不改变其全局安装策略。
|
|
43
|
+
|
|
44
|
+
本仓库补修:停机升级工具将裸 `dsh-openwrite` 规范为显式 `dsh-openwrite@latest`,
|
|
45
|
+
精确版本与本地 tarball 继续保持原意。doctor 单独显示 requested spec、resolved version、
|
|
46
|
+
诊断工具版本及精确重装目标,避免只看商城目录或笼统的“已安装”。对应维护/升级测试本地 **20 passed**。
|
|
47
|
+
安装指南补充官方 registry 检查、停机备份和已验收 0.2.28 的精确升级路径。
|
|
48
|
+
未给旧包添加兼容豁免,也未清空用户缓存、profile 或会话。
|
|
49
|
+
|
|
50
|
+
## #123:验收边界
|
|
51
|
+
|
|
52
|
+
[#140](https://github.com/LiPu-jpg/Openwrite/issues/140) 附件给出 Android/aarch64/bionic、
|
|
53
|
+
宿主 Python 3.14.8、pydantic 2.14.1 / pydantic-core 2.50.1、插件 0.2.26 的第三方实机记录,
|
|
54
|
+
包括 Studio 启动及 `GET / -> 200`。文档据此补全手机本地 external Studio 的步骤。
|
|
55
|
+
附件脚本作为证据阅读,未直接执行其下载或安装逻辑。
|
|
56
|
+
|
|
57
|
+
这仍不等于候选 0.2.29 在 Android 上的插件面板、Workspace、实际工具调用和鉴权已完整通过。
|
|
58
|
+
#123 的 Android/Termux 完整验收与宿主原生升级保护正式发布两项继续保留,不能因为此 PR 自动关闭。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# #149 / #150 / #151 跟进:预设别名噪声与 rc.4/rc.5 兼容声明
|
|
2
|
+
|
|
3
|
+
目标版本为 **0.2.29 候选**,尚未发布。Core 保持已验收的 5.8.20,wheel 字节及来源提交不变。
|
|
4
|
+
|
|
5
|
+
## #150 / #151 / #142:宿主 rc.4 / rc.5 被版本闸门拒绝
|
|
6
|
+
|
|
7
|
+
报告现象:`dsh plugin --profile desktop add dsh-openwrite` 在 DSH `0.2.1-rc.5` 上直接失败,
|
|
8
|
+
错误为 `plugin does not support the DSH version in use`。这是宿主读取
|
|
9
|
+
`package.json` 的 `peerDependencies`(`@deepseek-ai/dsh-*`)范围后拒绝加载,
|
|
10
|
+
`dsh.compatibility.dsh` 只是展示元数据,因此两处都必须同步扩展。
|
|
11
|
+
|
|
12
|
+
本版在根包与三个内嵌子包(`@dsh-novel/openwrite-bridge`、`@dsh-novel/studio-panel`、
|
|
13
|
+
`@dsh-external/dsh-dog``)的 `peerDependencies`、`dsh.compatibility.dsh`、`dshReleases`
|
|
14
|
+
以及四个 lock 文件中加入精确宿主 `0.2.1-rc.4` 与 `0.2.1-rc.5`;
|
|
15
|
+
发布矩阵(`.github/workflows/release-validation.yml`、`scripts/release-report.mjs`)
|
|
16
|
+
新增这两个宿主的客户端验收,并保留各自的 `--before` 截止时间,
|
|
17
|
+
避免上游部分发布时把更新的依赖批次带进旧宿主验收。
|
|
18
|
+
|
|
19
|
+
`0.1.2-rc.1`、`0.1.5-alpha.1`、`0.2.0-rc.2`、`0.2.1-rc.2`、`0.2.1-rc.3` 的 peer 匹配集合
|
|
20
|
+
逐项对比无变化(只增不改),旧宿主不受影响。`0.2.2-alpha.2`、`0.3.0` 仍不声明,保持未知。
|
|
21
|
+
|
|
22
|
+
本地实测(macOS arm64 / Node v24.15,真实官方 registry 的精确宿主包,0 次模型调用):
|
|
23
|
+
|
|
24
|
+
- `node scripts/preset-smoke.mjs --host-cli=<rc.4|rc.5 宿主>` 通过:29 行 entry list、24 个技能目录、宿主模块全部可解析。
|
|
25
|
+
- `node scripts/client-boot-smoke.mjs dsh-openwrite-0.2.29.tgz --host-cli=<rc.4|rc.5 宿主>` 通过:
|
|
26
|
+
版本闸门无豁免、客户端激活、预设选择、工作台三页签、DoG 面板与其他插件共存。
|
|
27
|
+
- 复现路径已验证:用改动前打包的同一源码 tarball 启动 rc.5 宿主,日志出现与报告完全一致的
|
|
28
|
+
`incompatible with dsh 0.2.1-rc.5`;改用本版声明的包后同一命令通过。
|
|
29
|
+
|
|
30
|
+
候选包 SHA-256(本地 `npm pack --ignore-scripts` 产物):
|
|
31
|
+
`a9acf18ce7177fde459b3cd7ca92cdd5d71bab7a1a7695a01c8740cd66a14f26`。
|
|
32
|
+
三份 `client-report-0.2.1-rc.{3,4,5}.json` 均绑定该哈希。未发布 npm/GitHub 新版本。
|
|
33
|
+
|
|
34
|
+
## #149:新建会话选择器里的 27 条「历史会话」别名
|
|
35
|
+
|
|
36
|
+
0.2.26 为修 #105 引入「旧 id 作别名」,`preset-definition.mjs` 里硬编码了全部已发布版本号,
|
|
37
|
+
`plugin.mjs` 无条件为其中每一个注册别名。宿主 `dsh-agent-preset-registry` 的 `list()`
|
|
38
|
+
返回全量定义且没有 hidden/selectable 字段,`order: 1000` 只能排序、不能隐藏,
|
|
39
|
+
于是磁盘上只有当前版本目录的用户也会看到 27 条同名别名,手机窄屏下几乎无法滚动。
|
|
40
|
+
|
|
41
|
+
本版把别名集合从「所有已发布版本」改为「会话存储里真实引用过的 id」:
|
|
42
|
+
|
|
43
|
+
- 启动时扫描 `<DSH_HOME>/sessions` 下的会话日志,只解每个日志的**第一帧**(会话头就在第一帧),
|
|
44
|
+
收集其中形如 `openwrite-\d+-\d+-\d+...` 的 `agentPreset` 值,去掉当前版本后注册别名。
|
|
45
|
+
`node:zlib` 的 `zstdDecompressSync` 只解首帧并忽略追加的事件帧,纯文本 `.jsonl` 同样支持;
|
|
46
|
+
每次只读前 256 KB。Node `>=22.15` 起内置 zstd,插件 `engines` 要求 `>=22.19.0`,无需新增依赖。
|
|
47
|
+
- 指纹缓存落到 `~/.dsh/openwrite/preset-aliases.json`(会话数 + 最新 mtime),
|
|
48
|
+
存储未变化时不再解压任何日志。
|
|
49
|
+
- 扫描整体失败(例如会话根目录不可读)时回退到原来的全量别名表,#105 的恢复能力不会丢失。
|
|
50
|
+
- 别名显示名改为可自解释的 `OpenWrite 创作(旧版 0.2.24 · 仅用于恢复历史会话)`,
|
|
51
|
+
不再把内部 id 直接暴露给作者;`order: 1000` 保持沉底。
|
|
52
|
+
- 当前发布自身的 id 不再注册别名:它已经以稳定 id `openwrite` 注册,其目录也由本插件管理。
|
|
53
|
+
工作台入口原先固定选择发布 id,现改为优先选择稳定 id `openwrite`,仅在宿主只注册发布 id 时回退,
|
|
54
|
+
因此选择器里 OpenWrite 只剩一条。
|
|
55
|
+
|
|
56
|
+
实测(真实 DSH `0.2.1-rc.5` 宿主 + Playwright,种子会话引用 `openwrite-0-2-24`):
|
|
57
|
+
|
|
58
|
+
- 改动前:选择器列出 `OpenWrite 创作` 加 27 条 `OpenWrite 创作(历史会话 openwrite-0-2-N)`。
|
|
59
|
+
- 改动后:只列出 `OpenWrite 创作` 与 `OpenWrite 创作(旧版 0.2.24 · 仅用于恢复历史会话)`。
|
|
60
|
+
- 该断言已进入 `scripts/client-boot-smoke.mjs`(`preset-selector-single-entry`):
|
|
61
|
+
空会话存储下 OpenWrite 必须只出现一次,且不得出现 `历史会话`/`旧版` 条目。
|
|
62
|
+
|
|
63
|
+
新增回归(`scripts/preset-lifecycle.test.mjs`,真实 zstd 多帧会话日志作夹具):
|
|
64
|
+
|
|
65
|
+
- 别名集合跟随会话引用;未引用的发布 id 不进选择器;`standard` 等其它预设被忽略。
|
|
66
|
+
- 会话存储不可读时保留全量别名表(#105 不回归)。
|
|
67
|
+
- 指纹缓存:存储不变时即使单条日志损坏仍返回缓存结果;新增会话后重新推导。
|
|
68
|
+
- 升级不重写会话日志(逐字节比对),作者自定义预设优先,卸载后只移除本插件注册的定义。
|
|
69
|
+
|
|
70
|
+
本地验证(当时):`node --test scripts/preset-lifecycle.test.mjs` **8 passed**;
|
|
71
|
+
`npm run test:maintenance` **58 passed**;`npm run docs:check`、`npm run doctor` 通过;
|
|
72
|
+
`npm --prefix packages/studio-panel run test:components` **344 passed**;
|
|
73
|
+
`npm run test:epochs` 通过;`npm --prefix vendor/dsh-dog test` **63 passed / 1 skipped**(该 vendored 包随后在「移除内置 DoG」改动中删除,此命令已不存在);
|
|
74
|
+
rc.3 / rc.4 / rc.5 三宿主客户端验收通过(含上述新增断言)。
|
|
75
|
+
`npm run test:contracts` 需要 `OPENWRITE_ROOT` 指向 OpenWrite 引擎检出,本机未配置,未运行。
|
|
76
|
+
|
|
77
|
+
#123 跟踪项中的「宿主正式发布」与「Android/Termux 真机验收」两项依旧保留,未因本轮修复勾选。
|