dsh-openwrite 0.2.8

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.
Files changed (275) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +107 -0
  3. package/THIRD_PARTY_NOTICES.md +33 -0
  4. package/assets/logo-dark.svg +31 -0
  5. package/assets/logo-light.svg +31 -0
  6. package/cordis.patch.yml +11 -0
  7. package/docs/BENCHMARK_TASKS.md +54 -0
  8. package/docs/COST_MEASUREMENT.md +39 -0
  9. package/docs/DEVELOPMENT.md +65 -0
  10. package/docs/DSH_STORE.md +58 -0
  11. package/docs/FRAMEWORK_ADVANTAGES.md +288 -0
  12. package/docs/IMPROVEMENT_PLAN.md +252 -0
  13. package/docs/INSTALL.md +99 -0
  14. package/docs/LEARNING.md +68 -0
  15. package/docs/OPEN_SOURCE_NOVEL_AUDIT.md +191 -0
  16. package/docs/PLUGIN_MAINTENANCE.md +54 -0
  17. package/docs/PLUGIN_MAINTENANCE_RC7.md +157 -0
  18. package/docs/QA_20260908.md +103 -0
  19. package/docs/QA_20260909_BENCHMARK.md +24 -0
  20. package/docs/RELEASE_ACCEPTANCE.md +116 -0
  21. package/docs/REVIEW_DAG_FRAMEWORK.md +82 -0
  22. package/docs/TARGETED_NOVEL_PROJECT_REVIEW.md +167 -0
  23. package/docs/WORKFLOWS.md +74 -0
  24. package/docs/WORKSPACE_CONTEXT_CONTRACT.md +125 -0
  25. package/docs/WORKSPACE_INTEGRATION_GOAL.md +278 -0
  26. package/docs/research/autosave-race-repro.mjs +133 -0
  27. package/docs/research/framework-stats-2026-09-05.json +116 -0
  28. package/dog-tools.mjs +11 -0
  29. package/package.json +132 -0
  30. package/packages/openwrite-bridge/LICENSE +201 -0
  31. package/packages/openwrite-bridge/cordis.patch.yml +10 -0
  32. package/packages/openwrite-bridge/lib/client.d.ts +95 -0
  33. package/packages/openwrite-bridge/lib/client.js +193 -0
  34. package/packages/openwrite-bridge/lib/contracts-generated.d.ts +367 -0
  35. package/packages/openwrite-bridge/lib/contracts-generated.js +1764 -0
  36. package/packages/openwrite-bridge/lib/dog-delivery.d.ts +12 -0
  37. package/packages/openwrite-bridge/lib/dog-delivery.js +362 -0
  38. package/packages/openwrite-bridge/lib/dog-review.d.ts +50 -0
  39. package/packages/openwrite-bridge/lib/dog-review.js +470 -0
  40. package/packages/openwrite-bridge/lib/domain.d.ts +70 -0
  41. package/packages/openwrite-bridge/lib/domain.js +496 -0
  42. package/packages/openwrite-bridge/lib/index.d.ts +17 -0
  43. package/packages/openwrite-bridge/lib/index.js +89 -0
  44. package/packages/openwrite-bridge/lib/managed-runtime.d.ts +95 -0
  45. package/packages/openwrite-bridge/lib/managed-runtime.js +510 -0
  46. package/packages/openwrite-bridge/lib/preset-tools.d.ts +13 -0
  47. package/packages/openwrite-bridge/lib/preset-tools.js +18 -0
  48. package/packages/openwrite-bridge/lib/tool-policy.d.ts +6 -0
  49. package/packages/openwrite-bridge/lib/tool-policy.js +56 -0
  50. package/packages/openwrite-bridge/lib/tools.d.ts +24 -0
  51. package/packages/openwrite-bridge/lib/tools.js +2404 -0
  52. package/packages/openwrite-bridge/package.json +67 -0
  53. package/packages/studio-panel/LICENSE +21 -0
  54. package/packages/studio-panel/README.md +51 -0
  55. package/packages/studio-panel/cordis.patch.yml +5 -0
  56. package/packages/studio-panel/lib/client.js +158087 -0
  57. package/packages/studio-panel/lib/client.js.map +1 -0
  58. package/packages/studio-panel/lib/index.js +50 -0
  59. package/packages/studio-panel/lib/types/client/AssetEditor.d.ts +122 -0
  60. package/packages/studio-panel/lib/types/client/AssetsView.d.ts +43 -0
  61. package/packages/studio-panel/lib/types/client/BenchmarkView.d.ts +9 -0
  62. package/packages/studio-panel/lib/types/client/ContinuousReader.d.ts +13 -0
  63. package/packages/studio-panel/lib/types/client/CreationView.d.ts +6 -0
  64. package/packages/studio-panel/lib/types/client/DagCanvas.d.ts +11 -0
  65. package/packages/studio-panel/lib/types/client/DiscardDraftDialog.d.ts +8 -0
  66. package/packages/studio-panel/lib/types/client/DomainToolCard.d.ts +9 -0
  67. package/packages/studio-panel/lib/types/client/GraphView.d.ts +46 -0
  68. package/packages/studio-panel/lib/types/client/HeaderChrome.d.ts +18 -0
  69. package/packages/studio-panel/lib/types/client/LaunchOpenWrite.d.ts +13 -0
  70. package/packages/studio-panel/lib/types/client/LibraryView.d.ts +6 -0
  71. package/packages/studio-panel/lib/types/client/MarkdownText.d.ts +3 -0
  72. package/packages/studio-panel/lib/types/client/ModelView.d.ts +9 -0
  73. package/packages/studio-panel/lib/types/client/OperationsView.d.ts +6 -0
  74. package/packages/studio-panel/lib/types/client/OutlinePlans.d.ts +37 -0
  75. package/packages/studio-panel/lib/types/client/OutlineView.d.ts +29 -0
  76. package/packages/studio-panel/lib/types/client/ResearchView.d.ts +7 -0
  77. package/packages/studio-panel/lib/types/client/ReviewCard.d.ts +28 -0
  78. package/packages/studio-panel/lib/types/client/SceneWorkbench.d.ts +55 -0
  79. package/packages/studio-panel/lib/types/client/SearchView.d.ts +33 -0
  80. package/packages/studio-panel/lib/types/client/TasksView.d.ts +11 -0
  81. package/packages/studio-panel/lib/types/client/TransferWorkspaces.d.ts +19 -0
  82. package/packages/studio-panel/lib/types/client/TurnMutationSummary.d.ts +62 -0
  83. package/packages/studio-panel/lib/types/client/VditorBody.d.ts +55 -0
  84. package/packages/studio-panel/lib/types/client/WorkbenchStore.d.ts +121 -0
  85. package/packages/studio-panel/lib/types/client/api.d.ts +72 -0
  86. package/packages/studio-panel/lib/types/client/asset-drafts.d.ts +20 -0
  87. package/packages/studio-panel/lib/types/client/benchmark-options.d.ts +43 -0
  88. package/packages/studio-panel/lib/types/client/draft-store.d.ts +26 -0
  89. package/packages/studio-panel/lib/types/client/dto.d.ts +517 -0
  90. package/packages/studio-panel/lib/types/client/index.d.ts +4 -0
  91. package/packages/studio-panel/lib/types/client/locales.d.ts +15 -0
  92. package/packages/studio-panel/lib/types/client/manuscript-annotations.d.ts +59 -0
  93. package/packages/studio-panel/lib/types/client/manuscript-markers.d.ts +61 -0
  94. package/packages/studio-panel/lib/types/client/manuscript-mentions.d.ts +30 -0
  95. package/packages/studio-panel/lib/types/client/manuscript-overlay-dom.d.ts +7 -0
  96. package/packages/studio-panel/lib/types/client/manuscript-overlay.d.ts +42 -0
  97. package/packages/studio-panel/lib/types/client/manuscript-selection.d.ts +59 -0
  98. package/packages/studio-panel/lib/types/client/model-view-memory.d.ts +17 -0
  99. package/packages/studio-panel/lib/types/client/storage.d.ts +8 -0
  100. package/packages/studio-panel/lib/types/client/workbench-epochs.d.ts +16 -0
  101. package/packages/studio-panel/lib/types/client/workspace-context.d.ts +52 -0
  102. package/packages/studio-panel/lib/types/client/writing-scope.d.ts +7 -0
  103. package/packages/studio-panel/lib/types/index.d.ts +5 -0
  104. package/packages/studio-panel/package.json +105 -0
  105. package/packages/studio-panel/vendor/vditor/LICENSE +21 -0
  106. package/packages/studio-panel/vendor/vditor/dist/css/content-theme/dark.css +123 -0
  107. package/packages/studio-panel/vendor/vditor/dist/css/content-theme/light.css +101 -0
  108. package/packages/studio-panel/vendor/vditor/dist/index.css +1823 -0
  109. package/packages/studio-panel/vendor/vditor/dist/index.min.js +1 -0
  110. package/packages/studio-panel/vendor/vditor/dist/js/i18n/zh_CN.js +86 -0
  111. package/packages/studio-panel/vendor/vditor/dist/js/icons/ant.js +174 -0
  112. package/packages/studio-panel/vendor/vditor/dist/js/lute/lute.min.js +72 -0
  113. package/plugin.d.ts +3 -0
  114. package/plugin.mjs +80 -0
  115. package/presets/README.md +32 -0
  116. package/presets/openwrite/agent.cordis.yml +317 -0
  117. package/presets/openwrite/preset.yml +3 -0
  118. package/presets/openwrite/skills/canon/SKILL.md +15 -0
  119. package/presets/openwrite/skills/dialoguequality/SKILL.md +166 -0
  120. package/presets/openwrite/skills/dog-delivery-query/SKILL.md +40 -0
  121. package/presets/openwrite/skills/dog-import-query/SKILL.md +27 -0
  122. package/presets/openwrite/skills/dog-review-query/SKILL.md +40 -0
  123. package/presets/openwrite/skills/export-book/SKILL.md +14 -0
  124. package/presets/openwrite/skills/foreshadow/SKILL.md +14 -0
  125. package/presets/openwrite/skills/foreshadowing-system/SKILL.md +125 -0
  126. package/presets/openwrite/skills/learn/SKILL.md +24 -0
  127. package/presets/openwrite/skills/novel-creator/SKILL.md +88 -0
  128. package/presets/openwrite/skills/novel-creator/templates/beat_templates.yaml +179 -0
  129. package/presets/openwrite/skills/novel-creator/templates/example_usage.yaml +74 -0
  130. package/presets/openwrite/skills/novel-reviewer/SKILL.md +85 -0
  131. package/presets/openwrite/skills/oh-story-deslop/LICENSE +21 -0
  132. package/presets/openwrite/skills/oh-story-deslop/SKILL.md +36 -0
  133. package/presets/openwrite/skills/oh-story-deslop/agents/openai.yaml +4 -0
  134. package/presets/openwrite/skills/oh-story-deslop/references/method.md +22 -0
  135. package/presets/openwrite/skills/oh-story-long-analyze/LICENSE +21 -0
  136. package/presets/openwrite/skills/oh-story-long-analyze/SKILL.md +37 -0
  137. package/presets/openwrite/skills/oh-story-long-analyze/agents/openai.yaml +4 -0
  138. package/presets/openwrite/skills/oh-story-long-analyze/references/method.md +22 -0
  139. package/presets/openwrite/skills/oh-story-long-scan/LICENSE +21 -0
  140. package/presets/openwrite/skills/oh-story-long-scan/SKILL.md +36 -0
  141. package/presets/openwrite/skills/oh-story-long-scan/agents/openai.yaml +4 -0
  142. package/presets/openwrite/skills/oh-story-long-scan/references/method.md +21 -0
  143. package/presets/openwrite/skills/oh-story-long-write/LICENSE +21 -0
  144. package/presets/openwrite/skills/oh-story-long-write/SKILL.md +37 -0
  145. package/presets/openwrite/skills/oh-story-long-write/agents/openai.yaml +4 -0
  146. package/presets/openwrite/skills/oh-story-long-write/references/method.md +33 -0
  147. package/presets/openwrite/skills/oh-story-review/LICENSE +21 -0
  148. package/presets/openwrite/skills/oh-story-review/SKILL.md +36 -0
  149. package/presets/openwrite/skills/oh-story-review/agents/openai.yaml +4 -0
  150. package/presets/openwrite/skills/oh-story-review/references/method.md +25 -0
  151. package/presets/openwrite/skills/progress/SKILL.md +16 -0
  152. package/presets/openwrite/skills/review-chapter/SKILL.md +17 -0
  153. package/presets/openwrite/skills/revise-span/SKILL.md +16 -0
  154. package/presets/openwrite/skills/style-system/SKILL.md +135 -0
  155. package/presets/openwrite/skills/style-system/prompts/analyze_style.md +214 -0
  156. package/presets/openwrite/skills/style-system/prompts/batch_extract_style.md +66 -0
  157. package/presets/openwrite/skills/style-system/prompts/compose_style.md +83 -0
  158. package/presets/openwrite/skills/style-system/prompts/extract_style.md +84 -0
  159. package/presets/openwrite/skills/style-system/prompts/initialize_style.md +52 -0
  160. package/presets/openwrite/skills/style-system/templates/analysis_report.yaml +78 -0
  161. package/presets/openwrite/skills/style-system/templates/composed_style.md +96 -0
  162. package/presets/openwrite/skills/style-system/templates/extraction_report.yaml +80 -0
  163. package/presets/openwrite/skills/style-system/templates/fingerprint.yaml +61 -0
  164. package/presets/openwrite/skills/style-system/tools/README.md +33 -0
  165. package/presets/openwrite/skills/truth-validation/SKILL.md +119 -0
  166. package/presets/openwrite/skills/workflow-manager/SKILL.md +81 -0
  167. package/presets/openwrite/skills/world-query/SKILL.md +45 -0
  168. package/presets/openwrite/skills/write-next/SKILL.md +17 -0
  169. package/release/core-requirements.in +12 -0
  170. package/release/licenses/@deepseek-ai__cosmokit@1.8.3/LICENSE +21 -0
  171. package/release/licenses/@deepseek-ai__schemastery@3.18.2/LICENSE +21 -0
  172. package/release/licenses/@isaacs__fs-minipass@4.0.1/LICENSE +15 -0
  173. package/release/licenses/@standard-schema__spec@1.1.0/LICENSE +21 -0
  174. package/release/licenses/@types__d3-color@3.1.3/LICENSE +21 -0
  175. package/release/licenses/@types__d3-drag@3.0.7/LICENSE +21 -0
  176. package/release/licenses/@types__d3-interpolate@3.0.4/LICENSE +21 -0
  177. package/release/licenses/@types__d3-selection@3.0.11/LICENSE +21 -0
  178. package/release/licenses/@types__d3-transition@3.0.9/LICENSE +21 -0
  179. package/release/licenses/@types__d3-zoom@3.0.8/LICENSE +21 -0
  180. package/release/licenses/@xyflow__react@12.11.6/LICENSE +21 -0
  181. package/release/licenses/@xyflow__system@0.0.82/LICENSE +21 -0
  182. package/release/licenses/ajv-formats@3.0.1/LICENSE +21 -0
  183. package/release/licenses/ajv@8.20.0/LICENSE +22 -0
  184. package/release/licenses/chownr@3.0.0/LICENSE.md +63 -0
  185. package/release/licenses/classcat@5.0.5/LICENSE.md +7 -0
  186. package/release/licenses/commander@7.2.0/LICENSE +22 -0
  187. package/release/licenses/d3-array@3.2.4/LICENSE +13 -0
  188. package/release/licenses/d3-axis@3.0.0/LICENSE +13 -0
  189. package/release/licenses/d3-brush@3.0.0/LICENSE +13 -0
  190. package/release/licenses/d3-chord@3.0.1/LICENSE +13 -0
  191. package/release/licenses/d3-color@3.1.0/LICENSE +13 -0
  192. package/release/licenses/d3-contour@4.0.2/LICENSE +13 -0
  193. package/release/licenses/d3-delaunay@6.0.4/LICENSE +14 -0
  194. package/release/licenses/d3-dispatch@3.0.1/LICENSE +13 -0
  195. package/release/licenses/d3-drag@3.0.0/LICENSE +13 -0
  196. package/release/licenses/d3-dsv@3.0.1/LICENSE +13 -0
  197. package/release/licenses/d3-ease@3.0.1/LICENSE +28 -0
  198. package/release/licenses/d3-fetch@3.0.1/LICENSE +13 -0
  199. package/release/licenses/d3-force@3.0.0/LICENSE +13 -0
  200. package/release/licenses/d3-format@3.1.2/LICENSE +13 -0
  201. package/release/licenses/d3-geo@3.1.1/LICENSE +34 -0
  202. package/release/licenses/d3-hierarchy@3.1.2/LICENSE +13 -0
  203. package/release/licenses/d3-interpolate@3.0.1/LICENSE +13 -0
  204. package/release/licenses/d3-path@3.1.0/LICENSE +13 -0
  205. package/release/licenses/d3-polygon@3.0.1/LICENSE +13 -0
  206. package/release/licenses/d3-quadtree@3.0.1/LICENSE +13 -0
  207. package/release/licenses/d3-random@3.0.1/LICENSE +13 -0
  208. package/release/licenses/d3-scale-chromatic@3.1.0/LICENSE +28 -0
  209. package/release/licenses/d3-scale@4.0.2/LICENSE +13 -0
  210. package/release/licenses/d3-selection@3.0.0/LICENSE +13 -0
  211. package/release/licenses/d3-shape@3.2.0/LICENSE +13 -0
  212. package/release/licenses/d3-time-format@4.1.0/LICENSE +13 -0
  213. package/release/licenses/d3-time@3.1.0/LICENSE +13 -0
  214. package/release/licenses/d3-timer@3.0.1/LICENSE +13 -0
  215. package/release/licenses/d3-transition@3.0.1/LICENSE +13 -0
  216. package/release/licenses/d3-zoom@3.0.0/LICENSE +13 -0
  217. package/release/licenses/d3@7.9.0/LICENSE +13 -0
  218. package/release/licenses/delaunator@5.1.0/LICENSE +15 -0
  219. package/release/licenses/elkjs@0.12.0/LICENSE.md +263 -0
  220. package/release/licenses/fast-deep-equal@3.1.3/LICENSE +21 -0
  221. package/release/licenses/fast-uri@3.1.7/LICENSE +30 -0
  222. package/release/licenses/fflate@0.8.2/LICENSE +21 -0
  223. package/release/licenses/graceful-fs@4.2.11/LICENSE +15 -0
  224. package/release/licenses/iconv-lite@0.6.3/LICENSE +21 -0
  225. package/release/licenses/internmap@2.0.3/LICENSE +13 -0
  226. package/release/licenses/json-schema-traverse@1.0.0/LICENSE +21 -0
  227. package/release/licenses/lucide-react@0.468.0/LICENSE +15 -0
  228. package/release/licenses/minipass@7.1.3/LICENSE.md +55 -0
  229. package/release/licenses/minizlib@3.1.0/LICENSE +26 -0
  230. package/release/licenses/proper-lockfile@4.1.2/LICENSE +21 -0
  231. package/release/licenses/require-from-string@2.0.2/license +21 -0
  232. package/release/licenses/retry@0.12.0/License +21 -0
  233. package/release/licenses/robust-predicates@3.0.3/LICENSE +24 -0
  234. package/release/licenses/rw@1.3.3/LICENSE +26 -0
  235. package/release/licenses/safer-buffer@2.1.2/LICENSE +21 -0
  236. package/release/licenses/signal-exit@3.0.7/LICENSE.txt +16 -0
  237. package/release/licenses/tar@7.5.7/LICENSE.md +55 -0
  238. package/release/licenses/use-sync-external-store@1.6.0/LICENSE +21 -0
  239. package/release/licenses/yallist@5.0.0/LICENSE.md +63 -0
  240. package/release/licenses/zustand@4.5.7/LICENSE +21 -0
  241. package/release/openwrite-5.8.1-py3-none-any.whl +0 -0
  242. package/release/platform-overrides.in +5 -0
  243. package/release/python-constraints.in +96 -0
  244. package/release/requirements.lock +2927 -0
  245. package/release/runtime-manifest.json +98 -0
  246. package/release/sdk-compatibility.json +240 -0
  247. package/release/source.json +859 -0
  248. package/release/wheels/cryptography-50.0.1-cp312-abi3-macosx_13_0_x86_64.whl +0 -0
  249. package/release/wheels/licenses/LICENSE.txt +177 -0
  250. package/release/wheels/provenance.json +15 -0
  251. package/scripts/dog/delivery-stage.js +32 -0
  252. package/scripts/dog/import-chapter.js +20 -0
  253. package/scripts/dog/import-record.js +35 -0
  254. package/scripts/dog/review-dimension.js +41 -0
  255. package/scripts/dog/review-record.js +42 -0
  256. package/scripts/maintenance.mjs +179 -0
  257. package/scripts/prepare.mjs +21 -0
  258. package/vendor/dsh-dog/LICENSE +29 -0
  259. package/vendor/dsh-dog/README.md +114 -0
  260. package/vendor/dsh-dog/UPSTREAM.md +22 -0
  261. package/vendor/dsh-dog/cordis.patch.yml +14 -0
  262. package/vendor/dsh-dog/lib/client.js +2898 -0
  263. package/vendor/dsh-dog/lib/client.js.map +1 -0
  264. package/vendor/dsh-dog/lib/core-BiEBMLz3.d.ts +495 -0
  265. package/vendor/dsh-dog/lib/core-DdfMcrB4.js +2074 -0
  266. package/vendor/dsh-dog/lib/core.d.ts +2 -0
  267. package/vendor/dsh-dog/lib/core.js +2 -0
  268. package/vendor/dsh-dog/lib/index.d.ts +133 -0
  269. package/vendor/dsh-dog/lib/index.js +967 -0
  270. package/vendor/dsh-dog/package.json +97 -0
  271. package/vendor/dsh-dog/schemas/schema-0.2/graph.schema.json +139 -0
  272. package/vendor/dsh-dog/schemas/schema-0.2/report.schema.json +87 -0
  273. package/vendor/dsh-dog/schemas/schema-0.2/run.schema.json +259 -0
  274. package/vendor/dsh-dog/schemas/schema-0.2/runtime-event.schema.json +105 -0
  275. package/vendor/dsh-dog/schemas/schema-0.2/verification.schema.json +40 -0
@@ -0,0 +1,99 @@
1
+ # 安装、更新与卸载
2
+
3
+ 安装已发布的版本;可下载产物、SHA-256 和实际平台结果以 [GitHub Release](https://github.com/LiPu-jpg/Openwrite/releases/tag/v0.2.7) 附件为准。验收方法见 [验收报告](RELEASE_ACCEPTANCE.md)。
4
+
5
+ ## 标准安装
6
+
7
+ 本次锁定 dsh `0.1.2-rc.1`,Node 24 为完整验收基线;Node 22.19 / 26 做兼容检查。安装不自动升级 dsh。先执行 `dsh --version` 核对宿主。
8
+
9
+ 安装命令:
10
+
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
13
+ dsh web
14
+ ```
15
+
16
+ `-w` 是 pnpm profile workspace 的安装参数。只输入 `dsh` 会要求 `--profile`;启动浏览器使用 `dsh web`。浏览器地址由宿主输出,不固定为 3080。
17
+
18
+ 点击侧栏 OpenWrite,等待环境准备完成。下载和安装进度来自同一个运行时状态,支持取消与重试。选择已有作品目录,或选择空目录后在创作工作台初始化。入口创建新创作会话,已有会话、作品和预设不被改写。点击「创作」进入编辑器;无需发送第一条消息。
19
+
20
+ Git 是可选的作品归档能力。未安装 Git 或 Git 初始化失败时,小说文件仍会保留,工作台显示自动 checkpoint 不可用;正常编辑和模型创作可以继续。
21
+
22
+ dsh 对话模型在宿主中配置。小说生成、评审与测试模型在「任务 → 模型」配置;安装健康检查不调用这些模型。
23
+
24
+ ## 安装影响
25
+
26
+ 本轮原生验收覆盖 macOS 15、Ubuntu 和 Windows GitHub 原生运行器。
27
+ 依赖包要求 Apple Silicon Mac 至少 macOS 14,Intel Mac 至少 macOS 13;
28
+ 其他系统小版本的覆盖范围以 Release 报告为准。
29
+
30
+ - 插件装在指定 profile。bridge、panel、DoG、技能、编辑器资源和 Core wheel 位于同一包。
31
+ - `$DSH_HOME/openwrite/` 保存下载缓存、Python 环境、管理记录、隔离配置与凭据;未指定 DSH_HOME 时使用 dsh 默认目录。
32
+ - 作品保存在作者选定目录。受管理 Core 仅监听回环地址,端口自动分配,实例认证只在宿主与 Core 之间传递。
33
+ - 只启动、停止本插件创建的进程。不修改系统 Python、全局 PATH 或 Shell 配置。
34
+ - 首次准备需要连接 GitHub 和 Python 包索引。版本及校验值见包内 `release/runtime-manifest.json`;依赖见 `requirements.lock`。
35
+
36
+ ## 从旧本地安装迁移
37
+
38
+ 旧开发安装会同时留下 `@dsh-novel/openwrite-bridge`、`@dsh-novel/studio-panel`、`@dsh-external/dsh-dog` 的 bundle 登记和 `dependencies`。只取消 bundle 而不走宿主 `dsh plugin remove` 时,随后的 `plugin add` 会按依赖重新登记,启动时报 `duplicate loader entry id: openwrite-bridge`。
39
+
40
+ 执行顺序(dsh 必须已停止;需要本机 `dsh` 与 `pnpm`):
41
+
42
+ 1. 下载并解开新 Release `.tgz`。
43
+ 2. 预览:检查 bundle **和** dependencies,不改文件。
44
+ 3. 应用:先备份,再对仍在依赖中的旧包执行宿主 `dsh plugin --profile <name> remove -w <旧包名>`;失败则恢复备份。
45
+ 4. 再执行下面的标准 `plugin add` 安装新包。
46
+ 5. 启动 `dsh web`。不要修改用户 `node_modules` 源码来掩盖重复加载。
47
+
48
+ ```sh
49
+ node package/scripts/maintenance.mjs migrate --profile web
50
+ 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
52
+ dsh web
53
+ ```
54
+
55
+ 备份写入 `$DSH_HOME/openwrite/migration-backups/`,包含 profile 的 `package.json` / lock、宿主 settings 和预设目录副本。不删除其他插件、用户配置、凭据、作品和历史会话。使用过旧 headless profile 的用户,再对 `--profile headless` 执行同样的预览与应用。
56
+
57
+ 预设按来源区分:带 `.openwrite-managed.json` 的是包装管理的官方版本预设(目录名为 `openwrite-<版本>`);没有该标记、或内容与包装校验不一致的,视为作者所有,迁移不会删除。本机若仍有旧名 `openwrite` 默认预设,会保留;已有会话继续使用当时绑定的预设,不会被改写。需要改官方预设时,先复制为 `openwrite-你的名称`。历史会话不会自动切换到新版本预设。
58
+
59
+ 旧全局模型配置不会被受管理环境自动读取;作者可在新环境中重新配置,也可停机备份后迁移相应配置文件。不要把凭据复制进作品或 Git 仓库。不要手工改用户 `node_modules` 里的 JS 来消除重复 loader。
60
+
61
+ ## 更新与回退
62
+
63
+ 停止 dsh,对照新 Release 的精确宿主兼容版本,用新 `.tgz` 再执行 `plugin add`。环境安装使用临时目录,校验并成功启动后才替换活动记录;失败保留旧环境和配置。取消或失败后可从入口重试。
64
+
65
+ 回退时,停止 dsh,重新安装上一份已验收 `.tgz`。官方预设采用版本 ID(如 `openwrite-0-2-1`),不会覆盖用户预设。请先把官方预设复制为 `openwrite-你的名称` 再修改;对被直接修改的同版本官方预设,插件保留文件并报告冲突。
66
+
67
+ ## 卸载
68
+
69
+ 停止 dsh 后执行:
70
+
71
+ ```sh
72
+ dsh plugin --profile web remove -w dsh-openwrite
73
+ ```
74
+
75
+ 正常停止时卸载本插件服务、界面、连接与进程。作品、配置、凭据、会话和缓存默认保留。关闭全部 dsh 进程后,可单独删除 `$DSH_HOME/openwrite/cache/` 清理下载缓存;不要删除整个目录,其中也有配置与管理记录。异常强制退出留下的版本预设可保留排查,重装同版本并正常退出会清理未修改副本。
76
+
77
+ ## 自定义预设和高级配置
78
+
79
+ 自定义预设从官方版本复制,目录 ID 使用 `openwrite-` 前缀以启用创作界面。小说工具行是 `dsh-openwrite/tools`,DoG 工具行是 `dsh-openwrite/dog-tools`;不要再次注册全局 bridge 或 DoG 引擎。工具集合随会话预设保持稳定,不随界面切换。
80
+
81
+ 小说工具支持 `presentation: native`(默认)、`ptc` 或 `both`。只读策略和计划模式独立约束副作用。模型服务商已接收的请求可能无法撤回:取消后停止新调度和重试,保存已完成结果与用量;费用未知时显示未知,不计为零。
82
+
83
+ bridge 的高级 `mode: external` / `baseUrl` 配置继续支持外部 Core,不接管外部进程。默认 `managed` 不需要配置端口。旧显式地址配置仍按外部模式解释。
84
+
85
+ ## GitHub 源码安装
86
+
87
+ 源码安装使用 dsh 官方 GitHub source 机制:`dsh plugin --profile web add -w github:LiPu-jpg/Openwrite#v0.2.7`。仓库 `prepare` 自行构建三个插件,Core wheel 随固定提交提供,不访问相邻工作区。源码安装需要 Git 和构建依赖;建议普通用户优先使用已验收 Release 包。
88
+
89
+ 如果 pnpm 按本机策略阻止构建,按它显示的构建审批指引仅批准本包,再重试。安装脚本不放宽构建授权。源码安装也必须在发布验收中通过,不能用本机已编译目录代替。
90
+
91
+ ## 诊断
92
+
93
+ 界面「OpenWrite → 诊断与帮助」显示实时状态与可恢复错误。解包后执行 `node package/scripts/maintenance.mjs doctor --profile web` 检查标准包登记、**bundle 与 dependencies 中的旧包**、以及环境是否准备;不打印凭据或调用模型。若仍报告 leftover 旧包,先停止 dsh 再执行 `migrate --apply`。
94
+
95
+ 受管理后端随 **dsh 进程** 运行:首次打开时准备,就绪后若进程异常退出会有限次自动恢复(带退避),启动失败也按同一上限继续重试。连续失败后显示脱敏的退出码/信号并提供手动重试;恢复失败不会把 dsh 一起退出。取消准备、退出 dsh 或卸载插件不会把后端拉起来,也不会留下未处理错误。恢复只重新连接写作服务,不会重放写作、评审或其他付费请求。本插件不是开机常驻服务。
96
+
97
+ 小说工具的只读 / 计划模式 / Workspace 绑定是 **dsh 策略与桥接检查**,不是操作系统沙箱。受管理 Python 与安装子进程只继承启动、代理和证书所需环境变量,不把无关 API Key 传给子进程。
98
+
99
+ 反馈请提供宿主版本、系统与架构、Release 版本、安装阶段及脱敏错误。来源、许可证和校验值见 Release 附件及包内 `release/`。不要提交 API Key、浏览器登录 URL 或作品全文。
@@ -0,0 +1,68 @@
1
+ # OpenWrite / dsh-novel 学习与完善进度
2
+
3
+ 日期:2026-09-06。本文件是 S1–S6 之后的学习文档:对照七个外部项目,记录计划做的、正在做的、做完的。
4
+ 实施状态以本文件与 [GOAL.md](../GOAL.md) 为准;对话历史不能覆盖仓库证据。
5
+
6
+ ## 范围
7
+
8
+ - OpenWrite 是领域后端;dsh-novel 是 DeepSeek Harness 插件与原生工作台。不另建 RAG / lorebook / 第二套正文存储。
9
+ - **示例书不在目标内**(non-goal)。不要为演示做内置样书、市场一键安装包、KDP/封面/有声书。
10
+ - S1–S6 已验收,见 [GOAL.md](../GOAL.md) 与 [IMPROVEMENT_PLAN.md](IMPROVEMENT_PLAN.md)。本轮不重做保存队列、草稿恢复、接纳 SHA、导入归档、场景双序。
11
+
12
+ ## 对照项目(固定 URL)
13
+
14
+ | 项目 | URL |
15
+ |---|---|
16
+ | Casting-Workflow | https://github.com/dama-cyber/Casting-Workflow |
17
+ | ainovel-cli | https://github.com/voocel/ainovel-cli |
18
+ | Scriverse | https://github.com/musnows/Scriverse |
19
+ | OpenFic | https://github.com/syrizelink/OpenFic |
20
+ | CharacterArc | https://github.com/uu201/character-arc |
21
+ | MuMuAINovel | https://github.com/xiamuceer-j/MuMuAINovel |
22
+ | InkOS | https://github.com/Narcooo/inkos |
23
+
24
+ 源码对照细节见 [TARGETED_NOVEL_PROJECT_REVIEW.md](TARGETED_NOVEL_PROJECT_REVIEW.md)。
25
+
26
+ ## 计划做的
27
+
28
+ 未在本轮验收范围内、仍值得后续做的项。完成一项就移到「做完的」。
29
+
30
+ | 项 | 学自 | 说明 |
31
+ |---|---|---|
32
+ | 示例书 | — | **明确排除。** 不要做。 |
33
+
34
+ ## 正在做的
35
+
36
+ 写作冲刺统计本轮已完成。计划做的只剩示例书(排除)。不开始示例书。
37
+
38
+ ## 做完的
39
+
40
+ ### 基线(S1–S6,2026-09-05)
41
+
42
+ 全部 **done**。证据在 [GOAL.md](../GOAL.md)。
43
+
44
+ | 阶段 | 状态 | 对应外部启发(已吸收,不再重做) |
45
+ |---|---|---|
46
+ | S1.1 正文保存状态机 | done | Scriverse 请求快照 / 排队 |
47
+ | S1.2 本地草稿恢复 | done | CharacterArc 草稿恢复 |
48
+ | S1.3 统一上下文计量 | done | InkOS 预算与估算口径 |
49
+ | S2 历史、修订、上下文检查、横评/研究页 | done | OpenFic 变更审阅;Scriverse before/after |
50
+ | S3 正文接纳与事实一致性 | done | ainovel-cli accepted SHA 与派生物失效 |
51
+ | S4 可恢复导入与完整迁移 | done | ainovel-cli 导入状态机;CharacterArc 项目档案 |
52
+ | S5 原生作者工作台 | done | 连续审读、搜索回跳、跨卷排序、工作简报 |
53
+ | S6 场景与双序结构 | done | 阅读顺序与故事时间分开 |
54
+
55
+ ### 本轮(2026-09-06)
56
+
57
+ | 项 | 状态 | 证据 |
58
+ |---|---|---|
59
+ | 学习文档(三桶 + 七 URL + S1–S6 done + 示例书排除) | done | [LEARNING.md](LEARNING.md);示例书写在范围里为 non-goal |
60
+ | write / review / workflow 技能对齐 `novel_*` | done | `presets/openwrite/skills/{novel-creator,novel-reviewer,workflow-manager}`;`npm run test:preset` 拒绝旧 Python 命令名并要求 `novel_outline_read` / `novel_write_chapter` / `novel_review_chapter` |
61
+ | 本章 due / overdue / to-plant 伏笔行动清单 | done | work-brief 的 `must_resolve`/`overdue`/`to_plant` 映射到创作检查器可打开的行动;组件测试 146 passed,含三项行动与展开详情 |
62
+ | 编辑器选区润色(扩写/缩写/去 AI 味/按审稿改这段) | done | 选区动作走 `/revisions/selection`(expand/compress/naturalize)与 `/revisions/from-review`;hunk 应用走 `/revisions/{id}/apply` + `selected_hunk_ids`,不 PUT 正文;源 revision 不一致时拒绝覆盖 |
63
+ | 正文提及高亮与资料卡 | done | 创作页用现有 `/assets` 的人物/地点名与别名做最长匹配;点击在创作视图打开只读资料卡;切章/切 Workspace 清卡;不进资料库、不 POST 资产更新 |
64
+ | 斜杠命令 / 7 个作者入口 | done | `presets/openwrite/skills/{progress,write-next,review-chapter,revise-span,foreshadow,canon,export-book}` 接到 `novel_*`;persona 默认工作流为看进度 → 写下一章 → 审这一章 → 改这段;其余技能 `user-invocable: false`;`npm run test:preset` 断言入口存在并拒绝旧 Python 命令名 |
65
+ | 项目级 `/learn` 写法记忆 | done | `presets/openwrite/skills/learn`:风格/成功钩子/作者偏好走 `novel_source_action` 与 `novel_structured_change_plan`,随 Workspace 资产走;无 cwd 时现有工具返回 `WORKSPACE_CONTEXT_MISSING`;`npm run test:preset` 24 skills / 8 author entries |
66
+ | 网文可选审稿维(钩子/黄金三章/追读力) | done | `form: web_novel` 时六域上附加 `max=0` 的钩子/黄金三章/追读力;37 项与质量分不变;黄金三章仅第 1–3 章;非网文项目不附加 |
67
+ | 每 50 章规划窗口 | done | `novel_rolling_plan_action` 默认/上限 50 章;`accepted_window` 只含已接纳正文,`planned_window` 只含未接纳大纲计划;create 不改正文/事实 |
68
+ | 写作冲刺统计 | done | 创作动态页从工作简报字数目标 + 已知 `writing_units_delta` 推导新增/删减/净增;修订净增只来自 `revision_applied`;无 delta 的事件不猜来源;不另建冲刺账本 |
@@ -0,0 +1,191 @@
1
+ # 开源小说工具对照与 dsh-Openwrite 改进清单
2
+
3
+ 核查日期:2026-09-05。对象为当前 `dsh-novel` 与相邻 `OpenWrite` 工作树。
4
+
5
+ 项目归属(用户确认):[OpenWrite Core](https://github.com/LiPu-jpg/Openwrite/tree/native-core) 是本团队自己的核心项目,
6
+ 当前 `dsh-novel` 是其 DeepSeek Harness 插件版本。本文以两仓库共同构成的产品能力为基线;
7
+ OpenWrite 已有而 dsh 面板尚未接入的能力,归为插件接入/交互缺口,不计为核心能力缺失。
8
+
9
+ 后续按用户指定的 Casting-Workflow、ainovel-cli、Scriverse、OpenFic、CharacterArc、MuMuAINovel 和 InkOS
10
+ 进行了固定提交的源码核查,见 [七项目专项对照](TARGETED_NOVEL_PROJECT_REVIEW.md)。其中补充了改稿后的事实联动、
11
+ 导入恢复、上下文保护以及 token 估算不一致的证据,扩展了本报告侧重界面的结论。
12
+
13
+ **结论:先保证稿件可靠保存,再把已有领域能力做成作者能直接使用的操作。**
14
+ 当前项目已有章节流水线、正典、评审与修订、上下文清单、版本快照、字数目标和导出能力。
15
+ 本轮发现的主要差距是保存正确性、版本恢复入口、场景组织、上下文透明度,以及整书交付体验。
16
+ 继续增加模型或工具数量并不能直接解决这些问题。
17
+
18
+ 本报告按传统写作软件、AI 辅助写作、编辑器插件选择代表项目,不作“最流行”排名。
19
+ 外部功能依据作者仓库和官方文档确认;本地结论依据源码审计,其中自动保存问题另有真实回调复现。
20
+ 未安装这些产品、运行跨产品写作质量评测、调用模型或修改真实稿件。
21
+ 下列改进均为待实施建议,不代表功能已交付。
22
+
23
+ ## 1. 代表项目:学什么,以及不能误认为什么
24
+
25
+ | 项目 | 许可、维护与产品边界 | 已确认的设计及值得借鉴之处 |
26
+ |---|---|---|
27
+ | **novelWriter** | GPLv3;[26.1.2](https://github.com/saga-soft/novelWriter/releases/tag/v26.1.2) 于 2026-07-25 发布,8 月仍有提交。[仓库与许可](https://github.com/saga-soft/novelWriter) | `@pov`、在场 `@char`、提及 `@mention` 分开;稿件构建可以筛选、预览、保存配置并生成多种格式。适合学习有明确语义的人物引用,以及可重复的导出配置。[引用手册](https://novelwriter.io/docs/usage/tags_and_references.html)、[稿件构建](https://novelwriter.io/docs/user_interface/manuscript.html) |
28
+ | **Manuskript** | GPLv3 或后续版本;[0.17.0](https://github.com/olivierkes/manuskript/releases/tag/0.17.0) 于 2025-06-30 发布,develop 在 2026-09-01 仍有打包修复。不能仅因发行间隔较长判断停更。[仓库](https://github.com/olivierkes/manuskript) | 从一句话发展到摘要、人物与情节;编辑侧栏展示 POV、状态、目标、故事线;历史可比较和恢复。最适合补我们的章节历史界面。[官网](https://www.theologeek.ch/manuskript/)、[侧栏手册](https://github.com/olivierkes/manuskript/wiki/Overview-of-Manuskript-Right-Sidebar) |
29
+ | **bibisco Community Edition** | 公开 CE 仓库为 GPLv3;最近可见源码提交为 2024-09 的 4.0.0,官网产品已发布 [5.1.3(2026-08-12)](https://bibisco.com/docs/bibisco-5-release-notes/)。这两条版本线不能混同。[CE 仓库](https://github.com/andreafeccomandi/bibisco) | 人物访谈与叙事结构分开组织。产品的全书连续阅读、双击回到场景编辑值得研究,但连续阅读、时间线、EPUB 等属于 Supporters 功能,不能宣传为免费 CE 已有能力。[连续阅读介绍](https://bibisco.com/blog/whats-new-in-bibisco-novel-writing-software-3-0/)、[版本差异](https://bibisco.com/docs/differences-between-community-and-supporters-editions/) |
30
+ | **AI_NovelGenerator** | AGPLv3;仓库可见 2026-08 更新。README 中 2026-03 的重写版本说明仍称初步框架、功能尚未就绪,不应把重写计划当作交付。[作者仓库](https://github.com/YILING0013/AI_NovelGenerator) | 设置与蓝图、多阶段写章、状态与伏笔追踪、知识库检索、一致性检查集中在 GUI 流程。可学创建作品到章节定稿的引导;我们的后端已有相近能力,不宜再造一套 RAG。上述是功能说明,不是长篇文学质量的实验证据。 |
31
+ | **SillyTavern** | AGPLv3;仓库在 2026-08 仍有维护。定位主要是聊天与角色扮演前端,不是完整成书系统。[仓库](https://github.com/SillyTavern/SillyTavern)、[官方文档](https://docs.sillytavern.app/) | World Info 有关键词/向量触发、注入位置、优先级和 token 预算。可学“为什么选中这条设定、放在哪里、为什么被预算排除”的控制方式。其文档也说明注入不保证模型遵守设定;中文不宜照搬英文整词匹配。[World Info](https://docs.sillytavern.app/usage/core-concepts/worldinfo/) |
32
+ | **Novel Word Count(Obsidian 插件)** | MIT;[5.0.0](https://github.com/isaaclyman/novel-word-count-obsidian/releases/tag/5.0.0) 于 2026-08-03 发布。[作者仓库](https://github.com/isaaclyman/novel-word-count-obsidian) | 单篇目标向目录汇总,可排除设定笔记,结合 CJK 字符与空格分词计数。可学章节、卷、全书进度;v5 默认减少计数缓存写入。其文件树接入依赖未正式保证的宿主接口,有兼容性局限。[目标设置](https://github.com/isaaclyman/novel-word-count-obsidian#setting-goals)、[接口限制](https://github.com/isaaclyman/novel-word-count-obsidian#safety) |
33
+ | **Word Sprint(Obsidian 插件)** | MIT;最近可见发布 [0.3.2](https://github.com/kinabalu/obsidian-word-sprint/releases/tag/0.3.2) 为 2025-08-18,不能称近期持续活跃。[作者仓库](https://github.com/kinabalu/obsidian-word-sprint) | 把一次写作冲刺记录为新增、删除、净增、速度、停笔时间。可学“修稿也算劳动”的统计;多人模式仍列为 Coming Soon,中文计数本轮未实测。[功能说明](https://github.com/kinabalu/obsidian-word-sprint#features) |
34
+ | **StoryLine(Obsidian 插件)** | MIT;[1.10.64](https://github.com/PixeroJan/obsidian-storyline/releases/tag/1.10.64) 于 2026-09-01 发布。[作者仓库](https://github.com/PixeroJan/obsidian-storyline) | 场景卡片、情节网格、阅读顺序与时间顺序、按角色/地点/故事线分泳道;批量调整时间先展示预览。适合学习非线性小说组织。手册对 `sequence` 的定义有冲突,字段契约不能直接照搬;Flesch 可读性只适用英语。[手册](https://github.com/PixeroJan/obsidian-storyline/blob/main/HELP.md) |
35
+
36
+ Obsidian **宿主本身不开源**,这里研究的是各自有许可证的开源插件。[宿主官方说明](https://github.com/obsidianmd/obsidian-releases#about-this-repo)
37
+
38
+ 补充案例:
39
+
40
+ - **Plot Bunni**:MIT 的较小项目,不作为主流程度的证据。按幕、章、场景组织,并把前文和关联概念用于场景上下文;支持项目 JSON 与正文导出。可学场景、设定、写作操作之间的直接联系,但浏览器本地存储本身不等于经过验证的备份恢复机制。[作者仓库](https://github.com/MangoLion/plotbunni)
41
+ - **EPUBCheck**:BSD-3-Clause,由 DAISY 代表 W3C 维护的 EPUB 合规检查器;当前 README 标明 5.3.0。可作为导出后的格式检查,和小说内容预检配合。格式有效不证明文学质量或每种阅读器的排版效果。[官方仓库](https://github.com/w3c/epubcheck)
42
+
43
+ ## 2. 公开源码不等于相同的复用条件
44
+
45
+ **Longform** 很值得研究场景索引与导出工作流:重排场景改变项目组织信息;编译按“逐场景处理 → 合并 → 全稿处理”执行,可保存配置。
46
+ 但当前许可证是带用途限制的自定义 **FAFO 0.2**,不能标成 MIT;维护者在 2026-02-24 公开表示无时间继续维护并寻求接手者。
47
+ 因此单列为交互参考,不放进上表同类开源复用候选。
48
+ [编译文档](https://github.com/kevboh/longform/blob/main/docs/COMPILE.md)、[实际许可证](https://github.com/kevboh/longform/blob/main/LICENSE.md)、[维护交接声明](https://github.com/kevboh/longform/issues/327)
49
+
50
+ **Long-Novel-GPT** 的大纲到章节到正文、导入与提示词查看也可作为流程参考;本轮未在其仓库根目录确认到明确的许可证文件,不能因为源码可读就假设可自由复用。
51
+ [作者仓库](https://github.com/MaoXiaoYuZ/Long-Novel-GPT)
52
+
53
+ 本轮只分析设计,没有复制上游代码。以后引入代码或依赖时,应核对具体版本和文件的许可证。
54
+
55
+ ## 3. 本地不足:区分缺少界面与缺少能力
56
+
57
+ 以下优先级按稿件可靠性、作者控制能力和实施依赖排序,不代表工期估算。
58
+
59
+ ### P0:自动保存可能将未提交的草稿标为已保存
60
+
61
+ 位置:[CreationView.tsx](../packages/studio-panel/src/client/CreationView.tsx),`save`(核查时第 265 行)与 `updateDraft`;
62
+ [VditorBody.tsx](../packages/studio-panel/src/client/VditorBody.tsx) 关闭了编辑器自身缓存。
63
+
64
+ 现有 `save` 发送 `draftRef.current` 后,等待响应,再次读取已经可能变化的 `draftRef.current`,
65
+ 把它写入 `savedContentRef` 并无条件清除 dirty。后端版本检查不能补救从未收到的正文。
66
+
67
+ 本轮直接提取真实源码回调,在 Node VM 中延迟 PUT、输入新稿,再触发实际定时回调,确定性得到:
68
+
69
+ ```text
70
+ 开始保存 A → 等待 PUT 响应 → 作者输入 B → A 的响应成功
71
+ 实际发送正文: ["A"]
72
+ 界面草稿: B
73
+ savedContentRef: B
74
+ dirty: false
75
+ 最终界面状态: saved
76
+ 触发定时器及再次保存后:仍只有 1 个请求
77
+ ```
78
+
79
+ 这证明 B 未提交却被视为已保存,后续保存会跳过;退出/切章时依赖 dirty 的提示也会失效。
80
+ 证明范围是**真实源码回调执行**,不是 React、Vditor、浏览器完整交互测试。
81
+ 复现脚本:[autosave-race-repro.mjs](research/autosave-race-repro.mjs),使用 Node 24 从仓库根目录运行:
82
+
83
+ ```sh
84
+ node docs/research/autosave-race-repro.mjs
85
+ ```
86
+
87
+ 建议:在发送时冻结正文与文档身份;只确认服务器实际接收的那份内容。
88
+ 输入发生在请求期间时保留 dirty,并基于新的服务器版本继续提交;迟到响应不能改写另一章节/Workspace 的状态。
89
+ 本地草稿恢复可作为额外保护,不能替代修正保存状态机。
90
+
91
+ 验收:延迟 A 请求期间输入 B,A 成功后 B 仍待保存并最终提交;重复点击保存、版本冲突、失败重试、切章、切 Workspace、刷新恢复均不把未提交文本标成 saved。
92
+
93
+ ### P1:章节历史与恢复应接入创作面板
94
+
95
+ **已有能力**:OpenWrite 的 `ManuscriptVersionStore` 有列表、快照、加载、带 revision 检查的恢复;恢复前先创建快照。
96
+ bridge 的 `novel_manuscript_edit_action` 暴露 7 类版本/批注操作。
97
+ **缺口**:dsh 创作检查栏主要展示修订提案 JSON,没有面向作者的历史时间线、差异比较与恢复流程。
98
+ “修订建议”与“过去保存过的正文版本”应明确分开。
99
+
100
+ 证据:[manuscript_editing.py](../../OpenWrite/tools/manuscript_editing.py)、[bridge tools.ts](../packages/openwrite-bridge/src/tools.ts)、[CreationView.tsx](../packages/studio-panel/src/client/CreationView.tsx)。
101
+ 旧 Studio 的 [revisions.js](../../OpenWrite/tools/studio_assets/js/revisions.js) 已有界面实现可参考;仍按项目约定由 dsh 提供交互壳。
102
+
103
+ 借鉴 Manuskript。验收:可命名快照、比较两个版本、预览恢复差异、确认后恢复;拒绝基于旧 revision 的恢复,并能找回恢复前版本。实现时补齐 panel 需要的受控路由,不只添加按钮。
104
+
105
+ ### P1:展示生成上下文的组成与来源
106
+
107
+ **已有能力**:章节上下文包、人物状态、语义召回;`build_context_manifest` 已记录层级、来源、大小估算与 revision。
108
+ **缺口**:dsh 加载 `/context` 后主要保留 `markdown`,未将结构化清单作为可操作的来源检查器展示。
109
+ 现有部分来源只定位到目录,不能声称已经实现逐条证据溯源。
110
+
111
+ 证据:[context_manifest.py](../../OpenWrite/tools/context_manifest.py)、[novel_service.py](../../OpenWrite/tools/novel_service.py)、[CreationView.tsx](../packages/studio-panel/src/client/CreationView.tsx)。
112
+
113
+ 借鉴 SillyTavern 的预算与注入控制、novelWriter 的引用语义。
114
+ 验收:生成前可查看正典/人物状态/召回片段、来源链接、token 估算、缺失项、压缩/排除原因和包版本;改动设定后能比较上下文变化。
115
+ 显示“人物在场、被提及、担任 POV”的不同语义;正典约束不应被当作随机召回的普通参考。
116
+ 先接已有清单,只有真实缺失的字段才扩展后端。
117
+
118
+ ### P2:场景需要稳定身份与独立的阅读/时间顺序
119
+
120
+ **已有能力**:大纲有总纲、卷、节、章,章节可有目标、人物、地点、情绪和 beats。
121
+ **结构缺口**:章是最小节点;beats 是文本列表,并非可持久引用的场景实体。
122
+ 大纲工具禁止在章下新增子节点;当前 dsh 大纲操作也不含完整重排流程。
123
+
124
+ 证据:[models/outline.py](../../OpenWrite/models/outline.py)、[outline_tree.py](../../OpenWrite/tools/outline_tree.py)、[OutlineView.tsx](../packages/studio-panel/src/client/OutlineView.tsx)。
125
+
126
+ 借鉴 StoryLine、novelWriter 与 Plot Bunni。
127
+ 建议最小场景字段:稳定 ID、所属章、阅读序号、故事时间/区间、POV、在场人物、地点、状态、摘要、正文定位。
128
+ `reading_order` 与 `story_time` 必须分别定义;插叙/倒叙不能靠修改时间去迁就章节顺序。
129
+
130
+ 验收:重排、跨章移动、拆分/合并后正文与引用完整;导出遵循阅读顺序,时间线遵循故事时间;旧章节数据有可恢复迁移路径。
131
+ 这是领域模型变更,需同步 OpenWrite、共享契约、bridge 和 panel,不能仅做前端卡片排序。
132
+
133
+ ### P2:导出前预检与可验证的全项目备份
134
+
135
+ **已有能力**:MD/TXT/EPUB 导出、批注剥离、部分 XHTML 校验;`.owasset.zip` 可归档选定资产与依赖并带校验信息。
136
+ **缺口**:缺少统一的成稿预检与可保存导出配置;选定资产包也不等于包含正文、结构、历史、评审和项目配置的完整作品备份。
137
+ 当前稿件收集遇到重复章节 ID 会选取其中一个,应改为明确报告,避免作者误以为全部内容已导出。
138
+ 任务存储绑定 Workspace root,换目录后不能假设旧任务可直接续跑。
139
+
140
+ 证据:[novel_workspace.py](../../OpenWrite/tools/novel_workspace.py)、[epub_export.py](../../OpenWrite/tools/epub_export.py)、[asset_package.py](../../OpenWrite/tools/asset_package.py)、[task_store.py](../../OpenWrite/tools/task_store.py)、[OperationsView.tsx](../packages/studio-panel/src/client/OperationsView.tsx)。
141
+
142
+ 借鉴 novelWriter 的稿件构建、bibisco 的备份恢复和 EPUBCheck。
143
+ 验收分两条:
144
+
145
+ - 成稿导出先预览章节顺序、缺失/重复/空章节、字数、元数据和评审新鲜度;保存导出配置;EPUB 额外运行 EPUBCheck 并展示报告。草稿/备份导出与正式交付分开,不能因评审未通过而阻止备份。
146
+ - 全项目归档有版本化 manifest、校验和、包含/排除清单与外部资源说明;在新目录恢复并核对正文、结构、历史、评审一致;排除凭据,明确旧任务归档/迁移策略。以实际恢复测试证明备份有效。
147
+
148
+ ### P2:先显示已有字数目标,再增加写作会话统计
149
+
150
+ **已有能力**:全书/章节目标及持久化校验;bridge 有 `novel_writing_targets`。
151
+ **缺口**:dsh 编辑页未完整呈现目标控制与当前进度;未发现独立的每日目标/冲刺会话记录。
152
+
153
+ 证据:[writing_targets.py](../../OpenWrite/tools/writing_targets.py)、[studio_application.py](../../OpenWrite/tools/studio_application.py)、[tools.ts](../packages/openwrite-bridge/src/tools.ts)、[HeaderChrome.tsx](../packages/studio-panel/src/client/HeaderChrome.tsx)。
154
+
155
+ 借鉴 Novel Word Count 与 Word Sprint。
156
+ 验收:先把已有目标读写接入面板,再按章/卷/书汇总,排除设定笔记;明确中文字符、英文词、标点及 Markdown 的计数口径。
157
+ 冲刺记录新增/删除/净增、开始/暂停/结束,刷新后可恢复;AI 生成与人工输入仅在有明确事件依据时分开统计,不凭净增字数猜测来源。
158
+
159
+ ### P3:从搜索结果直接回到原文,并提供连续审读
160
+
161
+ **已有能力**:跨文件搜索、代码侧替换与差异能力;旧 Studio 已有若干查找快捷键。
162
+ **缺口**:dsh `SearchView` 每次请求固定 20 条结果,主要是短片段展示,缺少完整的跳转选区/替换工作流。
163
+ 当前新面板未完整接线快捷操作;本轮没有验证宿主或 Vditor 自带快捷键,不能断言“完全没有快捷键”。
164
+
165
+ 证据:[SearchView.tsx](../packages/studio-panel/src/client/SearchView.tsx)、[tool_runtime.py](../../OpenWrite/tools/agent/tool_runtime.py)、[旧 Studio application.js](../../OpenWrite/tools/studio_assets/js/application.js)。
166
+
167
+ 借鉴 bibisco 的连续阅读与回跳编辑。
168
+ 验收:点击命中项定位当前正确版本的原文;查找有范围、大小写/整词选项;替换先展示数量与 diff,并结合 revision 与恢复能力。
169
+ 整章/整书连续阅读可展示现有评审和批注,点击段落能回到对应章与选区;中文查找不强依赖英文整词规则。
170
+
171
+ ## 4. 建议实施顺序与维护方式
172
+
173
+ 1. **稿件可靠性**:修复自动保存竞态,补覆盖请求期间输入与切换文档的回归;接入已有历史比较/恢复。
174
+ 2. **作者可控的 AI**:展示上下文清单、来源与预算;把创建作品、准备上下文、写章、审阅、修订的现有流程串成清晰入口。
175
+ 3. **长篇组织与交付**:明确场景契约及迁移,再做阅读/时间双序;补导出预检、完整备份和异地路径恢复验证。
176
+ 4. **日常写作体验**:呈现已有目标,增加冲刺统计、搜索回跳和连续阅读。
177
+
178
+ 每项沿用“OpenWrite 领域实现 → 共享契约与 bridge → dsh 面板 → 针对风险的验证”,
179
+ 不新增平行的正文、版本、状态或模型调用存储。
180
+ 工程安装与升级门禁继续参考 [插件维护手册](PLUGIN_MAINTENANCE.md);本报告不改变既有评审与交付标准。
181
+
182
+ 不优先照搬:没有质量证据的一键超长生成宣传、已有能力的第二套 RAG、把英文可读性公式用于中文、
183
+ 仅凭随机注入维持正典,以及无法验证恢复结果的“自动备份成功”提示。
184
+
185
+ ## 5. 核查记录与复核入口
186
+
187
+ - 项目资料来自上列作者仓库、许可证、发布记录及官方手册。版本日期只代表本轮可见状态,不代表长期维护保证。
188
+ - Manuskript 的侧栏 Wiki 较旧;bibisco 当前产品与公开 CE 源码不同步;Longform 正在维护交接。借鉴前需按实际目标版本复核。
189
+ - 本地只进行了源码审计和自动保存回调复现。没有跨产品安装试用、生成质量排名、真实浏览器验收或生产稿件读写。
190
+ - 本轮新增报告及审计复现脚本,README 增加入口;未实施上述生产功能或修复。自动保存复现脚本断言的是当前缺陷,修复时应改为要求 B 被提交的防回归用例,不能将“缺陷复现成功”当作产品通过。
191
+ - 下一项具体工作:从 `CreationView.save` 的请求快照、串行提交与文档身份隔离入手修复 P0,再进行 React 与真实浏览器的连续输入验收。
@@ -0,0 +1,54 @@
1
+ # OpenWrite 标准插件维护
2
+
3
+ 当前候选基线为 dsh 0.1.2-rc.1、Cordis 4.0.2、Node 24;实际 SDK 图记录在 `release/sdk-compatibility.json`。不要机械地把所有依赖改成同一版本,也不要追随 alpha。旧本地安装的历史记录见 [rc.7 维护记录](PLUGIN_MAINTENANCE_RC7.md),不再作为用户安装指南。
4
+
5
+ ## 构建与验证
6
+
7
+ ```sh
8
+ npm ci --ignore-scripts
9
+ node scripts/prepare.mjs
10
+ npm run check:plugin
11
+ npm run test:managed
12
+ npm --prefix vendor/dsh-dog run typecheck
13
+ npm --prefix vendor/dsh-dog test
14
+ node scripts/release-provenance.mjs
15
+ npm pack --ignore-scripts
16
+ node scripts/release-check.mjs
17
+ node scripts/release-smoke.mjs
18
+ ```
19
+
20
+ `prepare` 对 GitHub 源码压缩包同样有效,不依赖 `.git` 或相邻 Core。Release 包已编译,不需要安装时构建。客户端与宿主分别检查类型;浏览器产物不得携带 Node、第二份 React、Cordis 或宿主服务。
21
+
22
+ `check:plugin` 保留旧开发脚本回归,普通用户使用 [标准安装指南](INSTALL.md)。模型替身与真实模型验收分开记录。自动化使用隔离 DSH_HOME、配置和 ProjectRegistry;本机人工验收仅使用 `~/my_novel`。
23
+
24
+ ## 发布产物
25
+
26
+ 根包 `dsh-openwrite` 组合运行时、bridge、panel、DoG 和版本预设。Core 使用 `native-core` 固定 commit 的 wheel;用户无需切换分支。版本、来源和所有平台下载哈希记录在 runtime manifest。
27
+
28
+ Python 主依赖从该 wheel 的 METADATA 导出到 `release/core-requirements.in`,用固定 uv 重建:
29
+
30
+ ```sh
31
+ uv pip compile release/core-requirements.in --universal --python-version 3.12 --generate-hashes --constraint release/python-constraints.in --override release/platform-overrides.in --output-file release/requirements.lock
32
+ ```
33
+
34
+ 重建后补入 `release/wheels/provenance.json` 中受控 Intel wheel 的哈希,并更新 runtime manifest 的 requirements SHA-256。Core 更新时同时刷新输入依赖和约束,检查平台 wheel 覆盖与库的原生加载。
35
+
36
+ Intel Mac cryptography wheel 由独立原生构建工作流从校验过的上游源码生成,保留静态 OpenSSL 的许可证、版本和链接检查。它是固定发布输入,不在每位用户机器上编译。升级该依赖须重新执行该工作流并审核产物。
37
+
38
+ `release/source.json` 记录 Git commit,或无 `.git` 的源码压缩包指纹,并列出 JavaScript 运行依赖来源。GitHub Actions 将同一 `.tgz` 交给原生 macOS、Linux、Windows 的 Node 24 安装与浏览器验收,另做 Node 22.19 和 26 兼容检查。发布必须推广通过验收的原文件及 SHA-256,不得重新打包后发布。
39
+
40
+ ## 生命周期与权限
41
+
42
+ 领域服务常驻宿主,模型工具由创作预设注册。新增工具及 action 必须分类实际副作用:未知和会持久化预览记录的操作按写入处理。只读策略、计划模式、Workspace 身份、revision 与作者确认分别检查。这些是宿主策略与桥接拒绝,不是操作系统沙箱。
43
+
44
+ 受管理后端仅使用自己的进程、动态回环端口和实例凭据。外部模式不接管用户进程。资源、请求、SSE、计时器、watcher 和 DoG 脚本都必须在创建它们的 scope 卸载时释放。
45
+
46
+ 官方预设按版本发布,多宿主使用租约保护。安装前检查同名未管理目录,禁止合并写入作者目录。迁移先备份,再通过宿主 `dsh plugin remove` 删除仍在 `dependencies` 或 bundle 列表中的三个旧包;失败恢复备份。作者修改过的预设按无包装标记或校验不一致识别,不会删除。卸载默认保留作品、配置、凭据和历史。
47
+
48
+ 受管理后端状态区分为:首次未启动、准备中、就绪、异常退出、恢复中、已取消、已卸载。dsh 运行期间已启动后端异常退出会有上限的退避重启,启动失败也计入该上限;恢复失败不得变成未处理拒绝、不得退出宿主。取消、宿主退出和卸载不复活。外部 `mode: external` 不接管进程。恢复不得重放付费任务。子进程环境为允许列表,不是 `process.env` 整包复制。
49
+
50
+ ## 成本与取消
51
+
52
+ 取消测试后停止新任务及重试,保存已完成候选、评审和实际用量。服务商在途请求不能保证撤回,界面持续显示取消中,直到结果收回或失败。未知费用不计为零。
53
+
54
+ 实测 90 个小说工具 native schema 为 63,614 UTF-8 字节。PTC 的传输 schema 为 944 字节,生成 SDK 为 60,232 字节,另有说明文本;未测 tokenizer 数量和真实请求缓存,因此不承诺节费比例。比较方法见 [成本测量](COST_MEASUREMENT.md)。PTC 要求宿主配置支持的 codeRuntime,可在工具行选择 presentation,或使用官方展示插件,避免同一 scope 重复声明。
@@ -0,0 +1,157 @@
1
+ # DeepSeek Harness 小说插件:建立、验证与维护
2
+
3
+ 核查日期:2026-09-05。本轮针对插件工程维护;原评审 v2、横评和研究工作台的后续功能仍见 [GOAL.md](../GOAL.md)。
4
+
5
+ ## 1. 版本基线与资料来源
6
+
7
+ 本项目当前支持 **DSH 0.1.0-rc.7 / Cordis 4.0.1 / Node ≥22.19.0**。
8
+ 三个 package manifest 固定直接 DSH 依赖及 peers,并用 `overrides` 固定传递依赖;
9
+ 三个 `package-lock.json` 一起维护。安装与 profile smoke 使用 pnpm 9.15.9 验证。
10
+ 初查时根 CLI 是 rc.7,但 185 个 DSH 传递包是 rc.8;
11
+ bridge 也有 15 个 rc.8 包,只有 panel 已统一。只看 `dsh --version` 不足以证明兼容。
12
+
13
+ 研究时官方 npm CLI `latest`/`next` 为 **0.1.2-rc.1**,官方 master 为 **0.1.3-alpha.1**
14
+ (核查 commit `d347e703908d0406b7a7ef80e3a0e594d86b2215`)。这两个版本未纳入本项目的兼容承诺。
15
+ 上游处于 developer preview,各包的发布标签并不齐步,升级必须按目标版本的实际依赖图核实。
16
+ 来源:[官方仓库](https://github.com/deepseek-ai/deepseek-harness)、
17
+ [CLI npm 元数据](https://registry.npmjs.org/@deepseek-ai%2Fdsh/latest)。
18
+
19
+ 核心资料:
20
+
21
+ | 维护问题 | 官方一手资料 | 本项目对应位置 |
22
+ |---|---|---|
23
+ | Bundle 与安装顺序 | [打包/安装教程](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.md) | 两包的 `package.json`、`cordis.patch.yml` |
24
+ | 命令行与更新 | [CLI 参考](https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/reference/README.md) | `scripts/install.sh` |
25
+ | 服务和资源撤销 | [Cordis 生命周期](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/cordis-tutorial/02-lifecycle-and-effects.md) | bridge `src/domain.ts` |
26
+ | 配置 schema | [配置教程](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/config.md) | bridge `src/index.ts` |
27
+ | Agent 预设 | [预设契约](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/preset/agent-presets/README.md) | `presets/openwrite/` |
28
+ | Web 构建与扩展槽 | [客户端模块](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/modules/README.md)、[Slots](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-slots/README.md) | panel `tsdown.config.ts`、`src/client/index.ts` |
29
+
30
+ master 链接用于追踪演进;rc.7 的具体行为还需对照已安装包源码。本轮直接核实了
31
+ `@deepseek-ai/dsh/lib/plugin-*.js`:官方 CLI 在 pnpm 成功后按实际依赖重新登记 bundles。
32
+
33
+ ## 2. 如何建立一个可维护的小说扩展
34
+
35
+ 本仓库保留三个边界:OpenWrite 实现领域行为;bridge 注册工具并代理 HTTP;panel 展示数据。
36
+ 添加能力时先定义后端响应和错误码,再补 bridge 工具/写白名单/失效资源,最后接 UI 和预设。
37
+ 已有 90 个 `novel_*` 工具。正文、阅读顺序、场景、评审、任务和导出始终按 session Workspace root 隔离;
38
+ 缺少身份时必须报错。具体协议见 [Workspace 契约](WORKSPACE_CONTEXT_CONTRACT.md)。
39
+
40
+ 一个 DSH Bundle 至少需要以下结构:
41
+
42
+ ```text
43
+ package.json # main/types/exports/files + dsh.bundle.patch
44
+ cordis.patch.yml # 以包名插入带稳定 id 的插件行
45
+ src/index.ts # 导出 name、apply,以及必要的 inject/Config
46
+ lib/ # 构建后的入口与声明
47
+ ```
48
+
49
+ 本项目的 `dsh.bundle.patch` 指向 `./cordis.patch.yml`。包必须携带补丁、JS、声明及静态资源;
50
+ 开发目录能运行不代表打包后完整。`npm run doctor` 用真实 `npm pack --dry-run` 清单验证这些文件。
51
+ 两个包目前均为 `private: true`,本轮交付方式仍是本地安装。
52
+
53
+ 工具通过 `ctx.tools.register` 注册。外部 SSE、HTTP 响应、计时器等必须属于创建它们的
54
+ Cordis scope,使用 `ctx.effect` 提供撤销操作;异步工作结束前检查 scope 是否仍存活。
55
+ 目前 bridge 的 SSE 和正在读取 epoch 的快照会在卸载/替换 webServer 时关闭与取消。
56
+ 测试必须覆盖重复挂载和请求未完成时卸载,不能只测首次加载。
57
+
58
+ Web 包另外声明 `dsh.client.platform: web`、`exports["./client"]`,通过
59
+ `window.__ModuleLoader__.load` 加载浏览器 bundle。沿用本仓库平台模块白名单与 purity gate;
60
+ 跨插件服务用依赖注入协作。上游 0.1.2-rc.1 的额外共享模块已有 `dsh.client.external`
61
+ 声明要求,迁移时需重新检查旧 `dsh-client-runtime/client` 的处理。
62
+
63
+ 预设是独立的完整 agent composition。只在 host 装一次 bridge;不要在 agent 预设重复注册领域服务。
64
+ 技能随 `presets/openwrite/skills` 安装,统一使用“六域累加评审,保留 37 项展开查询”。
65
+ 预设副本不会自动跟随源码变化;修改后重新安装并重启 profile,再用新会话验证。
66
+
67
+ ### Operation trace 与隐私边界
68
+
69
+ 每次 dsh 领域写调用携带 session、根调用、工具调用和工具名;OpenWrite 将它与 request、
70
+ 上下文 packet revision/来源/预算、模型调用用量以及领域 mutation summary 关联。用
71
+ `novel_trace_list` 查看最近记录,回合变更卡也会显示 trace 文件入口。
72
+
73
+ Trace 文件位于作品的 `data/traces/`,最多保留 100 条且最长 30 天。它只保存哈希、长度、
74
+ revision、来源路径、预算、模型/提供方、finish reason、usage 和脱敏后的领域实体字段。
75
+ 作者提示、上下文正文、模型输出、chain-of-thought、API key/credential/token,以及 mutation
76
+ before/after 原值均不落盘。凭据字段连哈希也不保存,避免形成可枚举指纹。修改 trace 契约时,
77
+ 必须保留这些否定断言测试,并核对 `openwrite.operation-trace.v1` 的 retention/privacy 字段。
78
+
79
+ ## 3. 安装、更新与本地启动
80
+
81
+ ```sh
82
+ # 前置:Node >=22.19、npm、pnpm、rsync;启动后端另需 uv 和 OpenWrite 源码
83
+ bash scripts/install.sh
84
+ npm run doctor -- --profiles
85
+
86
+ # 源码默认位于相邻 ../OpenWrite;QA 小说固定使用 ~/my_novel
87
+ OPENWRITE_DIR=/path/to/OpenWrite bash scripts/dev.sh --project "$HOME/my_novel"
88
+ ```
89
+
90
+ 安装器先对三个锁文件执行 `npm ci` 并构建,再复制预设和挂载插件。
91
+ web/headless 初始化均用 `--dump-config`,不调用模型;任一步失败会返回非零状态。
92
+ 挂载使用官方 `dsh plugin --profile … add -w <绝对路径>`,每次执行都能修复
93
+ “依赖已有但 bundle 未登记/本地链接失效”的状态。`-w` 适配 rc.7 的 pnpm workspace 转发。
94
+ 重复运行会同步本项目生成的 OpenWrite 预设;Goethe/Dante 迁移备份写入唯一目录
95
+ `$DSH_HOME/.agent-presets-legacy/<name>.XXXXXXXX/preset`,保留之前的备份。
96
+
97
+ 自定义 `DSH_HOME` 时,安装、doctor、启动三步必须使用相同值。
98
+ DoG 默认从 `Fun10165/dsh-dog` 的固定 `v1.2.0` 标签自动安装到
99
+ `$DSH_HOME/extensions/dsh-dog`;已有目录会复用。`DSH_DOG_DIR` 可指向开发工作树,
100
+ `DSH_DOG_AUTO_INSTALL=0` 可明确跳过。已有 `dog:` 设置保留原值;v1.2 会以调用会话的
101
+ Workspace 为捕获根,静态 `workspaceRoot` 只是缺少会话上下文时的兜底。
102
+ 安装不会重启已有 dsh 进程,更新后需要退出原进程再启动。
103
+
104
+ 开发 supervisor 只管理自己创建的 Studio/dsh 进程组:端口占用拒绝启动,
105
+ Studio 健康检查限时 30 秒,任一子进程退出或收到 Ctrl-C/SIGTERM 时清理两端及其后代。
106
+ 不要把 `dev.sh` 与后台常驻 daemon 同时绑定到同一端口。
107
+ 若自定义 `STUDIO_PORT`,还需在 dsh 的 bridge 配置中把 `baseUrl` 指向该端口。
108
+ 覆盖配置时注意后层替换整个行的 `config`,保留所需 timeout/outputDir 设置。
109
+
110
+ ## 4. 验证分层
111
+
112
+ ```sh
113
+ # 已安装依赖后,本仓库自包含验证:不需要密钥、小说或启动真实服务
114
+ npm run check:plugin
115
+
116
+ # 加上相邻 OpenWrite 的共享 schema/fixture 验证
117
+ OPENWRITE_ROOT=/path/to/OpenWrite npm run check
118
+
119
+ # 仅查版本/打包完整性;加 --profiles 才读取本机两个 profile 的包登记
120
+ npm run doctor
121
+
122
+ # 需要已有 .venv:Python/TS DoG 产物一致性
123
+ npm run test:dog
124
+ ```
125
+
126
+ `check:plugin` 包含构建、版本/打包 doctor、安装/退出/热重载回归、预设模块及技能解析、
127
+ 两个插件 smoke、epoch 测试与 React 组件测试。`test:maintenance` 可单独重跑工程维护测试,
128
+ 但要先构建 bridge。`test:profiles` 还用真实 rc.7 CLI 和 pnpm `--offline` 在临时目录
129
+ 安装本地链接、验证 web/headless 组合及漏登记修复;不会启动 Agent 或修改本机 profile。
130
+ GitHub Actions `plugin-check.yml` 在 Ubuntu/Node 24 上执行这一自包含门禁;
131
+ 依赖安装需要网络,测试不调用在线模型。工作流是否通过以实际 CI run 为准。
132
+
133
+ 运行中系统的验收另行执行:
134
+
135
+ ```sh
136
+ bash scripts/verify.sh
137
+ npm run test:e2e
138
+ ```
139
+
140
+ 这两项不是离线门禁。`verify.sh` 可能将 `~/my_novel` 登记到 dsh Workspace;
141
+ E2E 依赖服务与浏览器,跳过不算通过。前端 smoke 也不能替代真实浏览器布局验收。
142
+ 不应为让门禁通过而删测试、降质量阈值或把 provider 错误记成低质量分。
143
+
144
+ ## 5. 升级与回退流程
145
+
146
+ 1. 记录当前三个 manifest/lockfiles、profile 自定义 patch、预设自定义内容及现有测试结果。
147
+ 保留可恢复副本,不覆写未提交工作。
148
+ 2. 查看目标版本的实际 npm 包和官方发布记录,逐项比较工具 API、Workspace/session、
149
+ Cordis、客户端模块表、Slot props 与 preset composition;不要批量使用 `@latest`。
150
+ 3. 在隔离 checkout 修改直接依赖、peers 与 overrides,生成并审查三个锁文件。
151
+ `doctor` 会拒绝混版、宽松直接版本和缺失 override;新增传递包也要纳入检查。
152
+ 4. 用 `npm ci` 重建,先过 `check:plugin`、跨仓库 contracts,再进行真实 profile 和
153
+ `~/my_novel` 的只读浏览器验收。打包分发时从构建产物生成 tarball,再从包中验证入口。
154
+ 5. 确认后重新安装并重启。失败时恢复旧版源码与对应锁文件、重新 `npm ci`/build/安装、
155
+ 恢复必要的预设副本并重启;不要删除小说或复用新版本的不兼容状态来掩盖失败。
156
+
157
+ 本轮未升级到 0.1.2,也未修改本机 profile 或发布插件。下一次升级须补该版本的运行时证据。