dsh-cuigengji-plugin 0.4.3 → 0.4.4

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 (67) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -1
  3. package/cordis.patch.yml +3 -3
  4. package/docs/CHANGELOG.md +7 -0
  5. package/docs/agent-installation.md +19 -12
  6. package/docs/architecture.md +74 -74
  7. package/docs/desktop-migration-20260930.md +26 -26
  8. package/docs/development.md +7 -3
  9. package/docs/getting-started.md +17 -7
  10. package/docs/layout-progress.md +31 -31
  11. package/docs/market-listing.md +5 -3
  12. package/docs/npm-publishing.md +28 -12
  13. package/docs/package-name-migration.md +3 -3
  14. package/docs/planning-board.md +44 -44
  15. package/docs/presets.md +24 -24
  16. package/docs/release-process.md +15 -11
  17. package/docs/tavern-compatibility-audit-20261001.md +109 -109
  18. package/docs/test-report.md +139 -129
  19. package/docs/upgrade.md +3 -1
  20. package/docs/usage-review.md +13 -13
  21. package/lib/client.js +18 -14
  22. package/package.json +18 -14
  23. package/skills/cuigengji-maintenance/SKILL.md +2 -2
  24. package/src/adapters/dsh/prompt.js +36 -36
  25. package/src/adapters/dsh/rpc.js +96 -96
  26. package/src/adapters/dsh/skills.js +17 -17
  27. package/src/adapters/mcp/actions.js +6 -6
  28. package/src/adapters/mcp/client.js +172 -172
  29. package/src/adapters/mcp/server.js +40 -40
  30. package/src/application/bindings/session.js +72 -72
  31. package/src/application/queries/context.js +15 -15
  32. package/src/application/store.js +412 -412
  33. package/src/client/features/chapters/clipboard.ts +27 -27
  34. package/src/client/features/chapters/history.ts +11 -11
  35. package/src/client/features/chapters/index.jsx +118 -118
  36. package/src/client/features/chapters/sync.ts +155 -155
  37. package/src/client/features/chapters/useChapterSync.ts +39 -39
  38. package/src/client/features/context/index.jsx +22 -22
  39. package/src/client/features/memory/index.jsx +73 -73
  40. package/src/client/features/planning/Decorations.tsx +1 -1
  41. package/src/client/features/planning/Pages.tsx +11 -11
  42. package/src/client/features/planning/data.js +16 -16
  43. package/src/client/index.tsx +130 -130
  44. package/src/client/launcher.tsx +78 -78
  45. package/src/client/shared/creation.tsx +34 -34
  46. package/src/client/shared/detail-page.tsx +61 -61
  47. package/src/client/shared/drafts.js +17 -17
  48. package/src/client/shared/evidence.jsx +11 -11
  49. package/src/client/shared/groups.tsx +34 -34
  50. package/src/client/shared/preferences.tsx +104 -104
  51. package/src/client/shared/select-style.ts +25 -25
  52. package/src/client/shared/state.js +95 -95
  53. package/src/client/shared/ui.jsx +19 -19
  54. package/src/client/shared/workspace.tsx +11 -11
  55. package/src/client/style.ts +274 -274
  56. package/src/client/visual.ts +190 -190
  57. package/src/contracts/actions.js +19 -19
  58. package/src/contracts/planning.ts +52 -52
  59. package/src/domain/manuscript.ts +4 -4
  60. package/src/domain/planning/index.ts +113 -113
  61. package/src/domain/planning/model.ts +59 -59
  62. package/src/domain/preset/index.js +89 -89
  63. package/src/index.js +91 -91
  64. package/src/infrastructure/migrations/legacy.js +96 -96
  65. package/src/infrastructure/migrations/tavern.js +78 -78
  66. package/src/infrastructure/persistence/atomic-store.ts +80 -80
  67. package/src/infrastructure/persistence/project-layout.ts +1 -1
@@ -1,102 +1,112 @@
1
- # 公开版验收说明
2
-
3
- 最近发布验收:2026-10-10,版本 0.4.1,宿主基线 DSH 0.2.0-rc.2 / Windows,桌面内置 Node v24.18.1 / Electron 44.0.0 / pnpm 11.7.0。
4
-
5
- ## 0.4.1 官方安装入口与桌面实际操作验收
6
-
7
- - 使用正在运行的 Windows DSH,实际点击“插件 → 添加插件”,在主“包名或地址”输入公开 GitHub 仓库地址,保持中国大陆镜像源,安装成功;正常退出并重新启动后,关于页显示 0.4.1。没有放宽供应链检查或构建授权,也没有改动其他插件。
8
- - 同一个无 ref 仓库地址重复安装,已复现宿主沿用锁定旧提交并报“无法从依赖变更中确定安装了哪一个包”。改为带完整提交 SHA 的仓库地址后安装成功,再次完整重启;`test:live` 逐个核对 65 个安装文件,与当前编译文件和 Skill 一致。日常升级及无 Git 用户使用带版本号的 Release `.tgz`,具体步骤见安装指南。
9
- - 新建临时作品实际输入中文正文,检查自动保存后继续输入、无弹窗自动排版、45 字统计、目录收纳、章节拖拽排序、删除进入回收站及恢复。原有长目录滚到底部,没有扩展出整页白屏。
10
- - 在独立规划页右键原位创建两个未关联章节的情节节点,拖动卡片、端口连线、右键断线、直接滚轮缩放至 35%、适应视野,并新建文字便签和讨论框。设定分组、新建角色、完整内容查看和“多选”整行操作均实际通过。
11
- - 实际保存预设,发现并修复自己保存后误报“有更新”的提示;重新安装后实际保存不再误报。`test:presets` 同时验证三类酒馆预设上传、启停和排序、原件下载,以及真正并发更新仍保留未保存草稿。
12
- - 通过插件导出临时作品,在原生文件对话框保存 JSON,再选择该文件预览并“复用内容”导入为新作品。实际打开导入后的正文、规划和角色,核对正文排版、章节顺序、分组、规划页、框/便签和预设内容。完整重启后再次读取验证内容与位置;复用按原有规则重映射 ID、将设定标为未确认并默认停用导入预设。
13
- - 原有 4 部作品的 123 个作品文件在安装、重启、实际操作和测试清理前后逐个 SHA-256 相同。临时作品移出日常工作库,保留私有验收记录,当前会话恢复原作品。正式库升级状态为 `ready`,备份完整。
14
- - 隔离 profile 使用 DSH 原生包管理与桌面内置 Node/pnpm,验证本地 `.tgz` 的公开旧 0.3.13 → 0.4.1 升级、普通 GitHub 地址安装升级、完整提交 SHA 的无 Git 空库安装,并从安装目录加载插件和真实 stdio MCP。2 本合成作品、3 章、5 个正文版本、1 个回收站章节、3 条设定、2 个情节节点、1 个绑定及 3 个重试记录保留。
15
- - 178/178 单元测试、类型检查、构建、一致性检查及 GitHub CI 通过。仓库提供 58 个可直接安装的编译文件,构建仅由开发者显式执行;发布包审计排除私人小说、导出、日志、凭据和备份。
16
-
17
- 桌面实际操作使用合成作品;原有作品仅打开查看和核对哈希。右键/中键持续拖动与按住空格拖动不在本次 Windows 工具支持的手势内,未声称实际操作覆盖这些手势。没有调用模型连通性测试或验证模型生成文章的质量,兼容范围以已验证宿主为准。下文保留历史版本的测试范围,不代表本次重复运行全部历史 UI 脚本。
18
-
19
- ## 0.4.0 发布与旧用户升级验收
20
-
21
- - `npm test`:178/178 通过;类型检查与构建通过,六个 Skill 的格式验证通过。规划/设定工具与示例仍经实际注册的宿主工具和 stdio MCP 验证。
22
- - 升级专项 16/16:公开提交 `3edeccf59d95b590211f4a0f5cc61631f58636cf` 的 0.3.13 原代码生成两本合成作品,涵盖正文历史、回收站、角色/世界分组与关系、酒馆原件、启停预设、多页规划、讨论框/便签、正文来源、绑定与重试结果;v1/v2/v3/v4 迁移前后完整逻辑状态一致。
23
- - 验证重复重启不新建备份、未来版本的备份包含升级后写作、中断恢复复用原快照、错误目录/版本/缺失作品校验、损坏 JSON、升级记录、原始备份与索引缺失保护。迁移失败时维护工具和 RPC 不要求小说绑定,正文与导入导出被拦截,Agent pre-step 和系统提示词不阻止宿主维护操作。
24
- - Windows 隔离 profile 使用 DSH 原生 `runPluginCommand` 和桌面内置 pnpm,PATH 中找不到 Git、没有全局 Node。完成预构建 `.tgz` 的空库新安装,以及真实公开旧代码的 0.3.13 包到 0.4.0 更新;组合包自动启用,无关 profile 字段与 patch 文件原样保留。
25
- - 安装后从隔离 `node_modules` 加载编译入口,在桌面 Node 模式调用维护工具、接手索引、规划页面、有效预设和真实 MCP 设定读取;2 本作品、3 章、5 个正文版本、1 个回收站章节、3 条设定、2 个情节节点、1 个绑定及 3 个重试记录保留。新安装为可用空库,不附带作者小说。
26
- - 包文件清单审计通过,包含编译后的服务端、客户端、文档、维护 Skill 与作者授权的界面图片;不含小说工作数据、凭据、日志、私人导出、备份和测试运行目录。
27
-
28
- 这轮按作者要求没有使用 Computer Use 或浏览器界面自动化,也没有中断日常 DSH、改动日常小说或调用模型连通性测试。界面延续前几轮已试用的设计,仅把规划/设定入口改称“多选”;历史前端验收记录保留在下文。正式公开下载资产以 Release 的 `SHA256SUMS` 为准。
29
-
30
- ## 2026-10-10 章节目录底部空白修补
31
-
32
- - 章节目录成为隐藏排序状态元素的定位容器;状态元素固定在目录左上角,避免其位于长列表末尾时把滚动空间扩展到外层工作台。正文工作区约束溢出,目录滚到边界后不再向宿主传递滚动,也关闭边界回弹。
33
- - 保留目录本身作为滚动容器,拖拽排序的边缘自动滚动、回收站和分卷折叠沿用原逻辑。本轮按作者要求不进行 Computer Use 或浏览器界面自动化,实际滚动显示由作者安装后验收。
34
-
35
- ## 2026-10-10 画布缩略卡片与独立关于入口
36
-
37
- - 规划与设定的画布总览统一为“状态或类型标识+标题”,重新分配留白,隐藏摘要和章节引用,去掉缩略卡片的底部分隔线。角色与世界使用不同标识和轻量色彩,选中效果、边框和连接点随缩放保持可辨识;卡片尺寸与世界坐标连线锚点不变。
38
- - “关于催更姬”从设置移回顶部,首页与作品页面均可直接打开;关闭后回原页面并恢复入口焦点。写作预设仍从设置进入。
39
- - `test:graph` 通过:55% / 35% 总览中的长标题与身份信息、选中效果、连接点与曲线对齐、缩略卡片拖拽保存及连线,另保留原有画布交互回归。浅色与深色截图已检查。
40
- - `test:navigation` 通过:关于入口在 360 / 560 / 1200 px 始终可见,关闭及焦点恢复正确;保留正文草稿、光标、滚动与画布相机刷新回归。类型检查、构建与打包通过,安装包不包含小说数据。
41
- - 综合 `test:ui` 中部分旧入口与选择器已同步,但本轮没有完成该脚本的全程验收。作者要求不再进行界面自动化试用,安装后由作者亲自测试;本轮没有使用 Computer Use。
42
-
43
- ## 2026-10-09 欢迎页与批量管理
44
-
45
- - 欢迎页使用作者提供的头像,支持新建、导入和直接打开已有作品;作品按更新时间排列,超过六部时支持查找与展开。已有会话可从作品菜单进入“作品首页”,不解除当前小说绑定。没有活动会话时的工作区入口也使用同一头像与欢迎排版。
46
- - 设定与规划复用固定的批量操作区和整行选择列表;合并分组、页面的移动目标,显示已选数量,支持全选、半选与清空。筛选后只保留当前可见项的选择,加载或保存期间禁用操作;失败保留选择,完成后恢复原视图。
47
- - `test:welcome-batch` 通过:头像加载、作品查找及新建/打开/导入返回、绑定保持、整行选择、全选半选清空、筛选后移动范围、保存失败、跨页取消及所选情节间连线保持。360、560、1200 px 浅色及深色截图已检查,长列表独立滚动,操作区始终可见。
48
- - 相关 `test:controls`、`test:management`、`test:transfer`、`test:author-workflow` 与 `test:pages` 已通过。本轮只修改前端与预览测试,不沿用上一轮的 162 个服务端测试作为本轮运行结果。所有交互使用合成作品与隔离临时 Store,没有修改日常小说。
49
- - 最终 `npm pack` 的类型检查与构建通过,随后 `test:pages` 再次通过。安装包含 197 个文件及欢迎页头像,不包含小说运行数据。
50
- - 作者退出 DSH 后已实际安装到 desktop profile;`test:live` 核对 62 个构建及 Skill 文件全部一致,293 个小说数据文件在安装前后的 SHA-256 完全相同。安装及数据核对记录位于源码仓库之外的 `migration/20261009-welcome-batch`;本轮未通过桌面窗口点击新界面,界面验收范围为上述隔离 Workbench。
51
-
52
- ## 2026-10-09 顶部导航、正文间距与刷新体验
53
-
54
- - 顶部导航改为首页、正文、规划、设定、刷新、设置六个稳定入口。作品切换统一在作品首页完成;写作预设从设置中的“当前作品”进入,关于页也从设置进入。正文标题只保留章节操作菜单,常用的自动排版和正文显示设置直接可见。
55
- - 规划页把筛选、页面、新建情节、便签/讨论框、批量选择和历史记录分开;设定页把批量选择与新建设定分开。画布选中对象后显示就地操作条,移动、复制、讨论框和删除随选择出现,画布视图操作改为底部常驻的适应、缩放、撤销、重做和整理。
56
- - 刷新通过独立的只读资源版本触发当前页面重新读取,不重置正文草稿、原生光标、正文滚动位置、规划画布相机或设定详情草稿。导入/导出页也会重新读取目录但保留当前范围选择。
57
- - 正文编辑区取消叠加的底部内边距,最后一行与自动保存栏保持约 10–14px 间距;在 360、560、1200 px 及字号/行距变化下没有裁切和整体横向溢出。
58
- - `test:navigation` 通过:作品只从首页切换、设置内预设/关于入口、刷新期间保留正文草稿/光标/滚动、远端正文刷新、画布相机与设定草稿保留、筛选与就地画布工具栏、正文底部间距,以及浅色/深色和 360/560/1200 px 截图。另行复跑 `test:welcome-batch`、`test:controls`、`test:pages`、`test:management`、`test:transfer`、`test:presets`、`test:graph`、`test:directory`,均通过。
59
-
60
- ## 2026-10-09 统一导入 / 导出模块与页面
61
-
62
- - `npm test`:162/162 通过;`npm run typecheck`、`npm run build` 和 `npm pack --dry-run` 通过,包内容为 192 个文件,未包含小说运行数据。
63
- - 新增 `transfer.*` 作者端 RPC 和独立 TypeScript 模块,覆盖作品、正文、设定、规划、预设、全库六种范围;导出支持催更姬数据包,正文另支持 TXT / Markdown。
64
- - 导入页支持拖放/上传、自动识别催更姬备份、旧项目、酒馆角色卡/世界书/预设、TXT / Markdown,导入前预览范围、关联、样本、冲突和目标,确认后自动生成可恢复的导入前备份。
65
- - 恢复保留 ID 与历史,复用会重映射引用;同内容重试不会重复创建,预览后发生目标变化会阻止提交。部分酒馆资料不会把未选条目写进原始归档。
66
- - `test:transfer`、`test:management`、`test:presets`、`test:controls`、`test:author-workflow`、`test:directory`、`test:manuscript`、`test:chapter-order`、`test:graph`、`test:pages` 全部通过。导入/导出页的 360、560、1200 px 浅色与深色截图已检查,固定页头/页脚在窄屏仍可操作。
67
- - 统一入口位于作品菜单的“导入 / 导出”;章节、设定、规划和预设的快捷入口会预选对应范围。页面只管理小说工作数据,DSH 聊天、附件和 API 配置仍由 DSH 保存。
68
- - 最初仅完成源码验收,未安装到桌面,因此桌面仍显示旧页。随后在作者退出 DSH 后使用 `install-desktop.ps1` 实际安装;增强后的 `test:live` 逐个核对 62 个构建及 Skill 文件,全部一致。290 个小说数据文件在安装前后的 SHA-256 完全相同。安装包的 `TransferService.catalog` 可读取正式目录,DSH 已重新启动;本轮未通过桌面窗口点击新页。核对记录位于仓库之外的 `migration/20261009-transfer`。
69
-
70
- ## 2026-10-09 可读内容文件名(布局 4)
71
-
72
- - `npm test`:142/142;类型检查、构建及 `npm pack` 通过。新增 10 个文件名专项覆盖非法/保留字符、Unicode 长标题、重名及自存文件避让、章节/设定/页面改名、旧标题恢复、目录排序不改文件名、v3 → v4 迁移中断恢复、改名请求去重、无页面元数据的已删除规划内容、单本与全库备份及 ID/引用保持一致。
73
- - 修复规划页面改名时将未读取的节点/便签正文覆盖为空的问题;文件名变化前读取该页完整内容,默认页及其他页不受影响。
74
- - `test:management`、`test:author-workflow`、`test:controls`、`test:graph`、`test:pages`、`test:directory`、`test:presets`、`test:manuscript`、`test:chapter-order` 全部通过。每个交互脚本使用隔离的临时 Store。
75
- - 真实数据先复制隔离演练,再在 DSH 退出且新插件安装成功后应用正式迁移。4 本作品、13 个章节(含回收站)、14 条设定、6 个绑定、148 个请求记录完整保留;30 个内容文件改名,268 个原始记录的 SHA-256 一致。索引除物理路径映射外保持相同,完整逻辑数据与迁移前快照相同,工作数据导出/导入往返通过。
76
- - 本地安装包仍为 0.3.13,公开仓库未更新。安装后的持久化布局、Store、事务模块、工作数据服务和前端构建哈希与源码构建一致;`test:live` 通过。直接用桌面已安装包的运行时读取正式布局 4,完整数据与迁移前快照一致。本轮未通过桌面窗口重新操作正式小说。
77
-
78
- 迁移前快照位于数据目录的 `backups/before-readable-files-*`。`scripts/check-project-names-migration.mjs` 支持布局 2、3、4,默认只复制并校验副本;显式添加 `--apply` 才迁移原目录。演练与正式应用的报告保存在源码仓库之外。
79
-
80
- ## 2026-10-09 按书名存储目录
81
-
82
- `npm test` 132/132、类型检查与构建通过。新增目录专项覆盖 Windows 非法/保留名称、长书名、重名及大小写冲突、并发同名创建、已有同名文件保护、作品重命名、目录内额外文件保留、v2 → v3 完整迁移、目录移动中断恢复、改名重试去重、正文/历史/回收站/设定/多页规划引用,以及单本与全库备份兼容。普通索引与目标内容按需读取的原有测试仍通过。
83
-
84
- 管理页交互验收通过实际下载、恢复、去重与旧数据迁移,并验证全库导入前备份和冲突阻止。`scripts/check-project-names-migration.mjs <数据目录> <报告目录>` 在锁内复制隔离副本,迁移后逐文件比对原始内容,并检查完整逻辑数据和备份往返;明确传入 `--apply` 才迁移原目录。
85
-
86
- ## 2026-10-09 作者操作流程
87
-
88
- - `npm test`:123/123 通过;`npm run typecheck` 通过。
89
- - `test:author-workflow`:标题原位修改和取消保留正文及滚动位置;删除等待正在保存的正文,后续输入一并保存;目录撤销、回收站恢复和删除章不进入正文参考均通过。画布原位创建、取消新建并连接、已提交但响应丢失后的同请求重试、详情侧栏打开时平移画布、详情保存后立即拖动和批注原位编辑通过。
90
- - `test:chapter-order`:卷内与跨卷排序、保存失败、回执丢失、并发目录修改、自动保存中的拖拽、折叠/空卷、搜索后的全目录顺序、长目录边缘滚动、底部空白落点、键盘 Alt+方向键及窄屏抽屉均通过。回收站内已删除章节不可拖拽。
91
- - `test:pages`:独立页面、新建/编辑便签与讨论框、批注移动及尺寸持久化、作者与 Agent 的批注冲突合并、页面切换和重载通过。尺寸手势在保存结束、手柄恢复可用后执行。
92
- - `test:graph`、`test:directory`、`test:manuscript` 通过:覆盖两种图的连线、缩放、布局重试与并发,目录关闭按钮各区域,以及正文输入、中文组合输入、撤销重做、远端修改、Windows 换行与光标/滚动位置。
93
- - 1400、1024、700、390 px 布局无整体横向溢出,正文、画布卡片和详情侧栏截图已检查。
94
-
95
- 自动交互验收均使用合成作品与临时 Store。没有调用付费模型,也没有用日常小说进行删除、编辑或拖拽测试。旧 `test:ui` 中部分名称与入口尚未同步,这轮没有运行该脚本或声称全部历史 UI 脚本通过。
96
-
97
- 本地 `npm pack` 与桌面安装脚本完成,包仍使用 0.3.13;前端、服务端入口和规划 Skill 与源码哈希一致,`test:live` 安装文件检查通过。安装后已重新启动现有 DSH,系统进程确认工作窗口存在。更新前后的 118 个作品文件 SHA-256 一致,包括作者的原有作品。桌面自动化工具在重启后将该窗口识别为其他应用,因此本轮没有继续操作这个窗口;画面与交互验证范围为上面的隔离 Workbench。
98
-
99
- ## 0.3.13 画布专项验收(2026-10-03)
1
+ # 公开版验收说明
2
+
3
+ 最近兼容修补验收:2026-10-17,版本 0.4.4,目标宿主 DSH 0.2.1-rc.2 / Windows,桌面内置 Node v24.21.0 / Electron 44.7.0 / pnpm 11.28.5;旧宿主基线 0.2.0-rc.2。
4
+
5
+ ## 0.4.4 新版宿主兼容
6
+
7
+ - 使用新版桌面自带的原生插件管理器,复现原 0.4.3 因 `engines.dsh=0.2.0-rc.2` 被拒绝安装。0.4.4 显式声明两个已支持版本,不使用版本豁免或放宽供应链保护。
8
+ - 210/210 单元测试、TypeScript 类型检查和构建通过,新增官方兼容检查器的回归用例。正式 `src/` 功能源码延续 0.4.3,前端构建仅更新包元数据。
9
+ - 在独立临时 DSH profile 中,使用新版桌面自身的原生安装器、Electron Node 和内置 pnpm 安装 0.4.4;测试 PATH 不提供 Git 或全局 Node。升级先在旧桌面运行真实公开 0.4.3,再通过新版桌面更新,前后完整逻辑工作库摘要一致:2 部合成作品、3 章、5 个正文版本、1 个回收站章节、3 条设定、2 个情节节点、1 个会话绑定及 3 条重试记录均保留。
10
+ - 实际启动新版桌面内置 DSH Host,用 headless 浏览器打开宿主前端,检查侧栏入口、创建作品、正文读取/编辑/自动保存、规划与设定显示、写作预设和导入导出页面。没有页面异常或失败的插件请求。
11
+ - 在同一个真实宿主中检查五个工具、六个 Skill 的注册,并调用接手索引、设定 MCP、规划读取与维护完整性校验。所有操作使用虚构内容,不发送聊天或调用模型,不操作作者正式 DSH、profile 或小说。
12
+
13
+ 公开安装包、npm 状态及归档哈希以本版 Release 与发布状态报告为准;下文是历史版本的验收范围,不代表本次重新操作过作者正式环境。
14
+
15
+ ## 0.4.1 官方安装入口与桌面实际操作验收
16
+
17
+ - 使用正在运行的 Windows DSH,实际点击“插件 → 添加插件”,在主“包名或地址”输入公开 GitHub 仓库地址,保持中国大陆镜像源,安装成功;正常退出并重新启动后,关于页显示 0.4.1。没有放宽供应链检查或构建授权,也没有改动其他插件。
18
+ - 同一个无 ref 仓库地址重复安装,已复现宿主沿用锁定旧提交并报“无法从依赖变更中确定安装了哪一个包”。改为带完整提交 SHA 的仓库地址后安装成功,再次完整重启;`test:live` 逐个核对 65 个安装文件,与当前编译文件和 Skill 一致。日常升级及无 Git 用户使用带版本号的 Release `.tgz`,具体步骤见安装指南。
19
+ - 新建临时作品实际输入中文正文,检查自动保存后继续输入、无弹窗自动排版、45 字统计、目录收纳、章节拖拽排序、删除进入回收站及恢复。原有长目录滚到底部,没有扩展出整页白屏。
20
+ - 在独立规划页右键原位创建两个未关联章节的情节节点,拖动卡片、端口连线、右键断线、直接滚轮缩放至 35%、适应视野,并新建文字便签和讨论框。设定分组、新建角色、完整内容查看和“多选”整行操作均实际通过。
21
+ - 实际保存预设,发现并修复自己保存后误报“有更新”的提示;重新安装后实际保存不再误报。`test:presets` 同时验证三类酒馆预设上传、启停和排序、原件下载,以及真正并发更新仍保留未保存草稿。
22
+ - 通过插件导出临时作品,在原生文件对话框保存 JSON,再选择该文件预览并“复用内容”导入为新作品。实际打开导入后的正文、规划和角色,核对正文排版、章节顺序、分组、规划页、框/便签和预设内容。完整重启后再次读取验证内容与位置;复用按原有规则重映射 ID、将设定标为未确认并默认停用导入预设。
23
+ - 原有 4 部作品的 123 个作品文件在安装、重启、实际操作和测试清理前后逐个 SHA-256 相同。临时作品移出日常工作库,保留私有验收记录,当前会话恢复原作品。正式库升级状态为 `ready`,备份完整。
24
+ - 隔离 profile 使用 DSH 原生包管理与桌面内置 Node/pnpm,验证本地 `.tgz` 的公开旧 0.3.13 → 0.4.1 升级、普通 GitHub 地址安装升级、完整提交 SHA 的无 Git 空库安装,并从安装目录加载插件和真实 stdio MCP。2 本合成作品、3 章、5 个正文版本、1 个回收站章节、3 条设定、2 个情节节点、1 个绑定及 3 个重试记录保留。
25
+ - 178/178 单元测试、类型检查、构建、一致性检查及 GitHub CI 通过。仓库提供 58 个可直接安装的编译文件,构建仅由开发者显式执行;发布包审计排除私人小说、导出、日志、凭据和备份。
26
+
27
+ 桌面实际操作使用合成作品;原有作品仅打开查看和核对哈希。右键/中键持续拖动与按住空格拖动不在本次 Windows 工具支持的手势内,未声称实际操作覆盖这些手势。没有调用模型连通性测试或验证模型生成文章的质量,兼容范围以已验证宿主为准。下文保留历史版本的测试范围,不代表本次重复运行全部历史 UI 脚本。
28
+
29
+ ## 0.4.0 发布与旧用户升级验收
30
+
31
+ - `npm test`:178/178 通过;类型检查与构建通过,六个 Skill 的格式验证通过。规划/设定工具与示例仍经实际注册的宿主工具和 stdio MCP 验证。
32
+ - 升级专项 16/16:公开提交 `3edeccf59d95b590211f4a0f5cc61631f58636cf` 的 0.3.13 原代码生成两本合成作品,涵盖正文历史、回收站、角色/世界分组与关系、酒馆原件、启停预设、多页规划、讨论框/便签、正文来源、绑定与重试结果;v1/v2/v3/v4 迁移前后完整逻辑状态一致。
33
+ - 验证重复重启不新建备份、未来版本的备份包含升级后写作、中断恢复复用原快照、错误目录/版本/缺失作品校验、损坏 JSON、升级记录、原始备份与索引缺失保护。迁移失败时维护工具和 RPC 不要求小说绑定,正文与导入导出被拦截,Agent pre-step 和系统提示词不阻止宿主维护操作。
34
+ - Windows 隔离 profile 使用 DSH 原生 `runPluginCommand` 和桌面内置 pnpm,PATH 中找不到 Git、没有全局 Node。完成预构建 `.tgz` 的空库新安装,以及真实公开旧代码的 0.3.13 包到 0.4.0 更新;组合包自动启用,无关 profile 字段与 patch 文件原样保留。
35
+ - 安装后从隔离 `node_modules` 加载编译入口,在桌面 Node 模式调用维护工具、接手索引、规划页面、有效预设和真实 MCP 设定读取;2 本作品、3 章、5 个正文版本、1 个回收站章节、3 条设定、2 个情节节点、1 个绑定及 3 个重试记录保留。新安装为可用空库,不附带作者小说。
36
+ - 包文件清单审计通过,包含编译后的服务端、客户端、文档、维护 Skill 与作者授权的界面图片;不含小说工作数据、凭据、日志、私人导出、备份和测试运行目录。
37
+
38
+ 这轮按作者要求没有使用 Computer Use 或浏览器界面自动化,也没有中断日常 DSH、改动日常小说或调用模型连通性测试。界面延续前几轮已试用的设计,仅把规划/设定入口改称“多选”;历史前端验收记录保留在下文。正式公开下载资产以 Release 的 `SHA256SUMS` 为准。
39
+
40
+ ## 2026-10-10 章节目录底部空白修补
41
+
42
+ - 章节目录成为隐藏排序状态元素的定位容器;状态元素固定在目录左上角,避免其位于长列表末尾时把滚动空间扩展到外层工作台。正文工作区约束溢出,目录滚到边界后不再向宿主传递滚动,也关闭边界回弹。
43
+ - 保留目录本身作为滚动容器,拖拽排序的边缘自动滚动、回收站和分卷折叠沿用原逻辑。本轮按作者要求不进行 Computer Use 或浏览器界面自动化,实际滚动显示由作者安装后验收。
44
+
45
+ ## 2026-10-10 画布缩略卡片与独立关于入口
46
+
47
+ - 规划与设定的画布总览统一为“状态或类型标识+标题”,重新分配留白,隐藏摘要和章节引用,去掉缩略卡片的底部分隔线。角色与世界使用不同标识和轻量色彩,选中效果、边框和连接点随缩放保持可辨识;卡片尺寸与世界坐标连线锚点不变。
48
+ - “关于催更姬”从设置移回顶部,首页与作品页面均可直接打开;关闭后回原页面并恢复入口焦点。写作预设仍从设置进入。
49
+ - `test:graph` 通过:55% / 35% 总览中的长标题与身份信息、选中效果、连接点与曲线对齐、缩略卡片拖拽保存及连线,另保留原有画布交互回归。浅色与深色截图已检查。
50
+ - `test:navigation` 通过:关于入口在 360 / 560 / 1200 px 始终可见,关闭及焦点恢复正确;保留正文草稿、光标、滚动与画布相机刷新回归。类型检查、构建与打包通过,安装包不包含小说数据。
51
+ - 综合 `test:ui` 中部分旧入口与选择器已同步,但本轮没有完成该脚本的全程验收。作者要求不再进行界面自动化试用,安装后由作者亲自测试;本轮没有使用 Computer Use。
52
+
53
+ ## 2026-10-09 欢迎页与批量管理
54
+
55
+ - 欢迎页使用作者提供的头像,支持新建、导入和直接打开已有作品;作品按更新时间排列,超过六部时支持查找与展开。已有会话可从作品菜单进入“作品首页”,不解除当前小说绑定。没有活动会话时的工作区入口也使用同一头像与欢迎排版。
56
+ - 设定与规划复用固定的批量操作区和整行选择列表;合并分组、页面的移动目标,显示已选数量,支持全选、半选与清空。筛选后只保留当前可见项的选择,加载或保存期间禁用操作;失败保留选择,完成后恢复原视图。
57
+ - `test:welcome-batch` 通过:头像加载、作品查找及新建/打开/导入返回、绑定保持、整行选择、全选半选清空、筛选后移动范围、保存失败、跨页取消及所选情节间连线保持。360、560、1200 px 浅色及深色截图已检查,长列表独立滚动,操作区始终可见。
58
+ - 相关 `test:controls`、`test:management`、`test:transfer`、`test:author-workflow` 与 `test:pages` 已通过。本轮只修改前端与预览测试,不沿用上一轮的 162 个服务端测试作为本轮运行结果。所有交互使用合成作品与隔离临时 Store,没有修改日常小说。
59
+ - 最终 `npm pack` 的类型检查与构建通过,随后 `test:pages` 再次通过。安装包含 197 个文件及欢迎页头像,不包含小说运行数据。
60
+ - 作者退出 DSH 后已实际安装到 desktop profile;`test:live` 核对 62 个构建及 Skill 文件全部一致,293 个小说数据文件在安装前后的 SHA-256 完全相同。安装及数据核对记录位于源码仓库之外的 `migration/20261009-welcome-batch`;本轮未通过桌面窗口点击新界面,界面验收范围为上述隔离 Workbench。
61
+
62
+ ## 2026-10-09 顶部导航、正文间距与刷新体验
63
+
64
+ - 顶部导航改为首页、正文、规划、设定、刷新、设置六个稳定入口。作品切换统一在作品首页完成;写作预设从设置中的“当前作品”进入,关于页也从设置进入。正文标题只保留章节操作菜单,常用的自动排版和正文显示设置直接可见。
65
+ - 规划页把筛选、页面、新建情节、便签/讨论框、批量选择和历史记录分开;设定页把批量选择与新建设定分开。画布选中对象后显示就地操作条,移动、复制、讨论框和删除随选择出现,画布视图操作改为底部常驻的适应、缩放、撤销、重做和整理。
66
+ - 刷新通过独立的只读资源版本触发当前页面重新读取,不重置正文草稿、原生光标、正文滚动位置、规划画布相机或设定详情草稿。导入/导出页也会重新读取目录但保留当前范围选择。
67
+ - 正文编辑区取消叠加的底部内边距,最后一行与自动保存栏保持约 10–14px 间距;在 360、560、1200 px 及字号/行距变化下没有裁切和整体横向溢出。
68
+ - `test:navigation` 通过:作品只从首页切换、设置内预设/关于入口、刷新期间保留正文草稿/光标/滚动、远端正文刷新、画布相机与设定草稿保留、筛选与就地画布工具栏、正文底部间距,以及浅色/深色和 360/560/1200 px 截图。另行复跑 `test:welcome-batch`、`test:controls`、`test:pages`、`test:management`、`test:transfer`、`test:presets`、`test:graph`、`test:directory`,均通过。
69
+
70
+ ## 2026-10-09 统一导入 / 导出模块与页面
71
+
72
+ - `npm test`:162/162 通过;`npm run typecheck`、`npm run build` 和 `npm pack --dry-run` 通过,包内容为 192 个文件,未包含小说运行数据。
73
+ - 新增 `transfer.*` 作者端 RPC 和独立 TypeScript 模块,覆盖作品、正文、设定、规划、预设、全库六种范围;导出支持催更姬数据包,正文另支持 TXT / Markdown。
74
+ - 导入页支持拖放/上传、自动识别催更姬备份、旧项目、酒馆角色卡/世界书/预设、TXT / Markdown,导入前预览范围、关联、样本、冲突和目标,确认后自动生成可恢复的导入前备份。
75
+ - 恢复保留 ID 与历史,复用会重映射引用;同内容重试不会重复创建,预览后发生目标变化会阻止提交。部分酒馆资料不会把未选条目写进原始归档。
76
+ - `test:transfer`、`test:management`、`test:presets`、`test:controls`、`test:author-workflow`、`test:directory`、`test:manuscript`、`test:chapter-order`、`test:graph`、`test:pages` 全部通过。导入/导出页的 360、560、1200 px 浅色与深色截图已检查,固定页头/页脚在窄屏仍可操作。
77
+ - 统一入口位于作品菜单的“导入 / 导出”;章节、设定、规划和预设的快捷入口会预选对应范围。页面只管理小说工作数据,DSH 聊天、附件和 API 配置仍由 DSH 保存。
78
+ - 最初仅完成源码验收,未安装到桌面,因此桌面仍显示旧页。随后在作者退出 DSH 后使用 `install-desktop.ps1` 实际安装;增强后的 `test:live` 逐个核对 62 个构建及 Skill 文件,全部一致。290 个小说数据文件在安装前后的 SHA-256 完全相同。安装包的 `TransferService.catalog` 可读取正式目录,DSH 已重新启动;本轮未通过桌面窗口点击新页。核对记录位于仓库之外的 `migration/20261009-transfer`。
79
+
80
+ ## 2026-10-09 可读内容文件名(布局 4)
81
+
82
+ - `npm test`:142/142;类型检查、构建及 `npm pack` 通过。新增 10 个文件名专项覆盖非法/保留字符、Unicode 长标题、重名及自存文件避让、章节/设定/页面改名、旧标题恢复、目录排序不改文件名、v3 → v4 迁移中断恢复、改名请求去重、无页面元数据的已删除规划内容、单本与全库备份及 ID/引用保持一致。
83
+ - 修复规划页面改名时将未读取的节点/便签正文覆盖为空的问题;文件名变化前读取该页完整内容,默认页及其他页不受影响。
84
+ - `test:management`、`test:author-workflow`、`test:controls`、`test:graph`、`test:pages`、`test:directory`、`test:presets`、`test:manuscript`、`test:chapter-order` 全部通过。每个交互脚本使用隔离的临时 Store。
85
+ - 真实数据先复制隔离演练,再在 DSH 退出且新插件安装成功后应用正式迁移。4 本作品、13 个章节(含回收站)、14 条设定、6 个绑定、148 个请求记录完整保留;30 个内容文件改名,268 个原始记录的 SHA-256 一致。索引除物理路径映射外保持相同,完整逻辑数据与迁移前快照相同,工作数据导出/导入往返通过。
86
+ - 本地安装包仍为 0.3.13,公开仓库未更新。安装后的持久化布局、Store、事务模块、工作数据服务和前端构建哈希与源码构建一致;`test:live` 通过。直接用桌面已安装包的运行时读取正式布局 4,完整数据与迁移前快照一致。本轮未通过桌面窗口重新操作正式小说。
87
+
88
+ 迁移前快照位于数据目录的 `backups/before-readable-files-*`。`scripts/check-project-names-migration.mjs` 支持布局 2、3、4,默认只复制并校验副本;显式添加 `--apply` 才迁移原目录。演练与正式应用的报告保存在源码仓库之外。
89
+
90
+ ## 2026-10-09 按书名存储目录
91
+
92
+ `npm test` 132/132、类型检查与构建通过。新增目录专项覆盖 Windows 非法/保留名称、长书名、重名及大小写冲突、并发同名创建、已有同名文件保护、作品重命名、目录内额外文件保留、v2 → v3 完整迁移、目录移动中断恢复、改名重试去重、正文/历史/回收站/设定/多页规划引用,以及单本与全库备份兼容。普通索引与目标内容按需读取的原有测试仍通过。
93
+
94
+ 管理页交互验收通过实际下载、恢复、去重与旧数据迁移,并验证全库导入前备份和冲突阻止。`scripts/check-project-names-migration.mjs <数据目录> <报告目录>` 在锁内复制隔离副本,迁移后逐文件比对原始内容,并检查完整逻辑数据和备份往返;明确传入 `--apply` 才迁移原目录。
95
+
96
+ ## 2026-10-09 作者操作流程
97
+
98
+ - `npm test`:123/123 通过;`npm run typecheck` 通过。
99
+ - `test:author-workflow`:标题原位修改和取消保留正文及滚动位置;删除等待正在保存的正文,后续输入一并保存;目录撤销、回收站恢复和删除章不进入正文参考均通过。画布原位创建、取消新建并连接、已提交但响应丢失后的同请求重试、详情侧栏打开时平移画布、详情保存后立即拖动和批注原位编辑通过。
100
+ - `test:chapter-order`:卷内与跨卷排序、保存失败、回执丢失、并发目录修改、自动保存中的拖拽、折叠/空卷、搜索后的全目录顺序、长目录边缘滚动、底部空白落点、键盘 Alt+方向键及窄屏抽屉均通过。回收站内已删除章节不可拖拽。
101
+ - `test:pages`:独立页面、新建/编辑便签与讨论框、批注移动及尺寸持久化、作者与 Agent 的批注冲突合并、页面切换和重载通过。尺寸手势在保存结束、手柄恢复可用后执行。
102
+ - `test:graph`、`test:directory`、`test:manuscript` 通过:覆盖两种图的连线、缩放、布局重试与并发,目录关闭按钮各区域,以及正文输入、中文组合输入、撤销重做、远端修改、Windows 换行与光标/滚动位置。
103
+ - 1400、1024、700、390 px 布局无整体横向溢出,正文、画布卡片和详情侧栏截图已检查。
104
+
105
+ 自动交互验收均使用合成作品与临时 Store。没有调用付费模型,也没有用日常小说进行删除、编辑或拖拽测试。旧 `test:ui` 中部分名称与入口尚未同步,这轮没有运行该脚本或声称全部历史 UI 脚本通过。
106
+
107
+ 本地 `npm pack` 与桌面安装脚本完成,包仍使用 0.3.13;前端、服务端入口和规划 Skill 与源码哈希一致,`test:live` 安装文件检查通过。安装后已重新启动现有 DSH,系统进程确认工作窗口存在。更新前后的 118 个作品文件 SHA-256 一致,包括作者的原有作品。桌面自动化工具在重启后将该窗口识别为其他应用,因此本轮没有继续操作这个窗口;画面与交互验证范围为上面的隔离 Workbench。
108
+
109
+ ## 0.3.13 画布专项验收(2026-10-03)
100
110
 
101
111
  - `npm test`:93/93,通过坐标换算、鼠标锚点、负坐标往返、批量 CAS 回滚、重试去重、创建并连接及旧讨论框字段兼容。
102
112
  - 注册宿主工具经真实 stdio MCP 验证五个新增设定动作:graph.layout、graph.continue、graph.duplicate、graph.remove、edge.disconnect。
@@ -112,33 +122,33 @@
112
122
  ## 0.3.12 公开源码分离验收(2026-10-02)
113
123
 
114
124
  以下保留上一版本的验证记录,0.3.13 的本轮范围见上节。
115
-
116
- - 全新公开源码检出目录中 `npm ci` 完成。
117
- - `npm test`:89/89 通过,包括 Store、规划事务、页面、预设、导入转换、工作数据往返与真实 stdio MCP。
118
- - `npm run typecheck`、`npm run build` 通过。
119
- - `npm run test:ui`:真实 Workbench + 临时 Store 的浏览器检查通过,覆盖正文自动保存与远端同步、富文本复制、连续情节规划、设定与关系维护、分组筛选、草稿恢复、预设入口以及工作数据导入导出。
120
- - `npm pack` 完成,安装包包含许可证,文件清单不包含小说工作数据、个人导出或账号配置。
121
- - Windows 安装脚本语法解析通过;没有在本次验收中重新安装或中断日常 DSH。
122
- - 已检查公开文件列表、私人作品名称与常见密钥特征;本次同步不合并私人数据分支历史。
123
-
124
- 这些测试只使用合成测试作品和隔离目录,不读取作者的日常小说。
125
-
126
- ## 既有验证范围
127
-
128
- 此前迭代还分别检查过多页规划与批注、拖拽与连线、目录关闭区域、蓝色主题、下拉与常驻入口、酒馆资料和预设导入。复现脚本位于 `tests/ui-*.mjs`,本次没有重复运行全部专项界面脚本。
129
-
130
- 工具测试不等于 AI 在所有写作任务中都会自主正确选用工具。真实宿主 RPC、桌面重启后的界面和模型使用体验需要分别验收;0.4.1 已完成上文所列桌面重启和实际操作,没有调用模型,也不宣称任意未来 DSH 版本兼容。
131
-
132
- ## 复现
133
-
134
- ```powershell
135
- npm ci
136
- npm test
137
- npm run typecheck
138
- npm run build
139
- npm run test:ui
140
- npm run check:build
141
- npm run pack:release
142
- ```
143
-
144
- 专项交互对应 `test:graph`、`test:pages`、`test:directory` 和 `test:presets`。真实 RPC 回归请用独立 DSH 实例及小说数据目录运行 `test:rpc-flow`,该脚本会创建测试作品。
125
+
126
+ - 全新公开源码检出目录中 `npm ci` 完成。
127
+ - `npm test`:89/89 通过,包括 Store、规划事务、页面、预设、导入转换、工作数据往返与真实 stdio MCP。
128
+ - `npm run typecheck`、`npm run build` 通过。
129
+ - `npm run test:ui`:真实 Workbench + 临时 Store 的浏览器检查通过,覆盖正文自动保存与远端同步、富文本复制、连续情节规划、设定与关系维护、分组筛选、草稿恢复、预设入口以及工作数据导入导出。
130
+ - `npm pack` 完成,安装包包含许可证,文件清单不包含小说工作数据、个人导出或账号配置。
131
+ - Windows 安装脚本语法解析通过;没有在本次验收中重新安装或中断日常 DSH。
132
+ - 已检查公开文件列表、私人作品名称与常见密钥特征;本次同步不合并私人数据分支历史。
133
+
134
+ 这些测试只使用合成测试作品和隔离目录,不读取作者的日常小说。
135
+
136
+ ## 既有验证范围
137
+
138
+ 此前迭代还分别检查过多页规划与批注、拖拽与连线、目录关闭区域、蓝色主题、下拉与常驻入口、酒馆资料和预设导入。复现脚本位于 `tests/ui-*.mjs`,本次没有重复运行全部专项界面脚本。
139
+
140
+ 工具测试不等于 AI 在所有写作任务中都会自主正确选用工具。真实宿主 RPC、桌面重启后的界面和模型使用体验需要分别验收;0.4.1 已完成上文所列桌面重启和实际操作,没有调用模型,也不宣称任意未来 DSH 版本兼容。
141
+
142
+ ## 复现
143
+
144
+ ```powershell
145
+ npm ci
146
+ npm test
147
+ npm run typecheck
148
+ npm run build
149
+ npm run test:ui
150
+ npm run check:build
151
+ npm run pack:release
152
+ ```
153
+
154
+ 专项交互对应 `test:graph`、`test:pages`、`test:directory` 和 `test:presets`。真实 RPC 回归请用独立 DSH 实例及小说数据目录运行 `test:rpc-flow`,该脚本会创建测试作品。
package/docs/upgrade.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # 更新与数据迁移
2
2
 
3
+ 0.4.4 是基于 0.4.3 的宿主兼容修补,支持 DSH 0.2.1-rc.2 与 0.2.0-rc.2,不改变存储格式。0.4.3 在新版 DSH 被版本检查拒绝时,由宿主安装 `dsh-cuigengji-plugin@0.4.4`,保留原配置和数据根;不必先导出再导入,也不要删除旧作品。
4
+
3
5
  0.4.2 将公开名称统一为 `dsh-cuigengji-plugin`。旧名 `dsh-cuigengji` 安装的用户需要由升级 Agent 完成一次[安装名称迁移](package-name-migration.md),转接启用项和配置,避免两个包同时加载。小说目录、内部 ID、工具名与数据格式保持兼容。
4
6
 
5
7
  0.4.0 是第一次把“可维护升级”作为正式能力发布的版本。用户仍然通过 DSH 桌面版的原生插件管理安装,插件加载后会自动处理已有催更姬数据。用户不需要 Git、Node.js、pnpm,也不需要手工移动文件。
@@ -30,7 +32,7 @@
30
32
  然后使用真实加载版本和数据根进行校验:
31
33
 
32
34
  ```json
33
- {"action":"verify","args":{"expectedVersion":"0.4.2","expectedDataRoot":"C:\\Users\\用户\\AppData\\Local\\cuigengji"}}
35
+ {"action":"verify","args":{"expectedVersion":"0.4.4","expectedDataRoot":"C:\\Users\\用户\\AppData\\Local\\cuigengji"}}
34
36
  ```
35
37
 
36
38
  只有 `status.status` 为 `ready` 且 `verify.verified` 为 `true`,才能向用户报告更新完成。校验结果包含作品、章节、历史、设定、规划和绑定数量,不返回正文内容。
@@ -1,13 +1,13 @@
1
- # 使用审阅
2
-
3
- 本项目的交互以正文、规划与设定为主。查看当前使用方式,请从 [README](../README.md) 和[安装说明](getting-started.md)开始;旧版本的自动参考、规划批准门槛和分离阅读/编辑模式不再是当前行为。
4
-
5
- 需要重点检查的写作体验:
6
-
7
- - 长正文编辑、自动保存、目录收纳、版本恢复和冲突时草稿保留。
8
- - 规划与设定的分组搜索、详情返回位置、拖拽连线、取消和删除。
9
- - 规划独立页面、批注与背景框是否有助于作者和 AI 讨论推进。
10
- - 酒馆角色卡、世界书和预设的预览、取消、导入及有效内容核对。
11
- - 宽窄面板、深浅主题、键盘、下拉菜单与入口可达性。
12
-
13
- 浏览器交互验证使用隔离临时作品;接口测试不替代页面和模型实际使用。模型能否理解作者意图,还需要用真实创作场景持续观察。最新检查记录见[验收说明](test-report.md)。
1
+ # 使用审阅
2
+
3
+ 本项目的交互以正文、规划与设定为主。查看当前使用方式,请从 [README](../README.md) 和[安装说明](getting-started.md)开始;旧版本的自动参考、规划批准门槛和分离阅读/编辑模式不再是当前行为。
4
+
5
+ 需要重点检查的写作体验:
6
+
7
+ - 长正文编辑、自动保存、目录收纳、版本恢复和冲突时草稿保留。
8
+ - 规划与设定的分组搜索、详情返回位置、拖拽连线、取消和删除。
9
+ - 规划独立页面、批注与背景框是否有助于作者和 AI 讨论推进。
10
+ - 酒馆角色卡、世界书和预设的预览、取消、导入及有效内容核对。
11
+ - 宽窄面板、深浅主题、键盘、下拉菜单与入口可达性。
12
+
13
+ 浏览器交互验证使用隔离临时作品;接口测试不替代页面和模型实际使用。模型能否理解作者意图,还需要用真实创作场景持续观察。最新检查记录见[验收说明](test-report.md)。
package/lib/client.js CHANGED
@@ -45,7 +45,7 @@ var import_react = require("react");
45
45
  // package.json
46
46
  var package_default = {
47
47
  name: "dsh-cuigengji-plugin",
48
- version: "0.4.3",
48
+ version: "0.4.4",
49
49
  description: "\u50AC\u66F4\u59EC\uFF1A\u7ED9\u5927\u80A5\u9C7C\u4E00\u4E2A\u5C0F\u8BF4\u5DE5\u4F5C\u53F0\uFF0C\u4E00\u8D77\u5199\u6B63\u6587\u3001\u8BA8\u8BBA\u60C5\u8282\u3001\u6574\u7406\u4EBA\u7269\u4E0E\u4E16\u754C\u8BBE\u5B9A\u3002",
50
50
  type: "module",
51
51
  main: "runtime/index.js",
@@ -89,6 +89,7 @@ var package_default = {
89
89
  test: "node --test tests/*.test.js",
90
90
  "test:upgrade": "node --test tests/upgrade.test.js",
91
91
  "test:release": "node scripts/check-release-install.mjs",
92
+ "test:host-compat": "node scripts/check-host-compat.mjs",
92
93
  "test:rpc": "node scripts/rpc-smoke.mjs",
93
94
  "test:rpc-flow": "node scripts/rpc-flow.mjs",
94
95
  "test:live": "node scripts/live-smoke.mjs",
@@ -112,34 +113,37 @@ var package_default = {
112
113
  },
113
114
  engines: {
114
115
  node: ">=24",
115
- dsh: "0.2.0-rc.2"
116
+ dsh: "0.2.0-rc.2 || 0.2.1-rc.2"
116
117
  },
117
118
  dependencies: {
118
119
  "@modelcontextprotocol/sdk": "1.29.0",
119
- zod: "4.4.3",
120
- yaml: "2.9.0"
120
+ yaml: "2.9.0",
121
+ zod: "4.4.3"
121
122
  },
122
123
  peerDependencies: {
123
124
  "@deepseek-ai/cordis": "~4.0.4",
124
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
125
- "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2",
125
+ "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2 || 0.2.1-rc.2",
126
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2 || 0.2.1-rc.2",
126
127
  "@deepseek-ai/schemastery": "~3.18.4"
127
128
  },
128
129
  devDependencies: {
129
- "@deepseek-ai/dsh": "0.2.0-rc.2",
130
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
131
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.0-rc.2",
132
- "@deepseek-ai/dsh-mcp-client": "0.2.0-rc.2",
133
- "@deepseek-ai/dsh-skill": "0.2.0-rc.2",
134
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
130
+ "@deepseek-ai/dsh": "0.2.1-rc.2",
131
+ "@deepseek-ai/dsh-atomic-write": "0.2.1-rc.2",
132
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.2",
133
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.2",
134
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-rc.2",
135
+ "@deepseek-ai/dsh-mcp-client": "0.2.1-rc.2",
136
+ "@deepseek-ai/dsh-skill": "0.2.1-rc.2",
137
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
138
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
135
139
  "@playwright/test": "^1.55.0",
140
+ "@types/node": "^24.0.0",
136
141
  "@types/react": "^18.3.31",
137
142
  "@types/react-dom": "^18.3.7",
138
143
  esbuild: "^0.25.0",
139
144
  react: "^18.3.1",
140
145
  "react-dom": "^18.3.1",
141
- typescript: "^7.0.2",
142
- "@types/node": "^24.0.0"
146
+ typescript: "^7.0.2"
143
147
  },
144
148
  license: "MIT",
145
149
  repository: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-cuigengji-plugin",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "催更姬:给大肥鱼一个小说工作台,一起写正文、讨论情节、整理人物与世界设定。",
5
5
  "type": "module",
6
6
  "main": "runtime/index.js",
@@ -44,6 +44,7 @@
44
44
  "test": "node --test tests/*.test.js",
45
45
  "test:upgrade": "node --test tests/upgrade.test.js",
46
46
  "test:release": "node scripts/check-release-install.mjs",
47
+ "test:host-compat": "node scripts/check-host-compat.mjs",
47
48
  "test:rpc": "node scripts/rpc-smoke.mjs",
48
49
  "test:rpc-flow": "node scripts/rpc-flow.mjs",
49
50
  "test:live": "node scripts/live-smoke.mjs",
@@ -67,34 +68,37 @@
67
68
  },
68
69
  "engines": {
69
70
  "node": ">=24",
70
- "dsh": "0.2.0-rc.2"
71
+ "dsh": "0.2.0-rc.2 || 0.2.1-rc.2"
71
72
  },
72
73
  "dependencies": {
73
74
  "@modelcontextprotocol/sdk": "1.29.0",
74
- "zod": "4.4.3",
75
- "yaml": "2.9.0"
75
+ "yaml": "2.9.0",
76
+ "zod": "4.4.3"
76
77
  },
77
78
  "peerDependencies": {
78
79
  "@deepseek-ai/cordis": "~4.0.4",
79
- "@deepseek-ai/dsh-tools": "0.2.0-rc.2",
80
- "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2",
80
+ "@deepseek-ai/dsh-atomic-write": "0.2.0-rc.2 || 0.2.1-rc.2",
81
+ "@deepseek-ai/dsh-tools": "0.2.0-rc.2 || 0.2.1-rc.2",
81
82
  "@deepseek-ai/schemastery": "~3.18.4"
82
83
  },
83
84
  "devDependencies": {
84
- "@deepseek-ai/dsh": "0.2.0-rc.2",
85
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
86
- "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.0-rc.2",
87
- "@deepseek-ai/dsh-mcp-client": "0.2.0-rc.2",
88
- "@deepseek-ai/dsh-skill": "0.2.0-rc.2",
89
- "@deepseek-ai/dsh-system-prompt": "0.2.0-rc.2",
85
+ "@deepseek-ai/dsh": "0.2.1-rc.2",
86
+ "@deepseek-ai/dsh-atomic-write": "0.2.1-rc.2",
87
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.2",
88
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.2",
89
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "0.2.1-rc.2",
90
+ "@deepseek-ai/dsh-mcp-client": "0.2.1-rc.2",
91
+ "@deepseek-ai/dsh-skill": "0.2.1-rc.2",
92
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
93
+ "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
90
94
  "@playwright/test": "^1.55.0",
95
+ "@types/node": "^24.0.0",
91
96
  "@types/react": "^18.3.31",
92
97
  "@types/react-dom": "^18.3.7",
93
98
  "esbuild": "^0.25.0",
94
99
  "react": "^18.3.1",
95
100
  "react-dom": "^18.3.1",
96
- "typescript": "^7.0.2",
97
- "@types/node": "^24.0.0"
101
+ "typescript": "^7.0.2"
98
102
  },
99
103
  "license": "MIT",
100
104
  "repository": {
@@ -5,7 +5,7 @@ description: 安装或更新催更姬后,查询自动迁移、备份和完整
5
5
 
6
6
  # 催更姬安装与更新维护
7
7
 
8
- 这份 Skill 只处理插件本身的安装、升级与数据验证,不参与小说创作。用户通常不会写代码,因此应使用 DSH 原生插件管理安装维护者发布的预构建 `.tgz`,再让 DSH 正常重启。不要让用户安装 Git、Node.js、pnpm,也不要让 Agent 直接改小说文件或手工重命名数据目录。
8
+ 这份 Skill 只处理插件本身的安装、升级与数据验证,不参与小说创作。用户通常不会写代码,因此应使用 DSH 原生插件管理安装维护者发布的预构建 `.tgz`,按宿主返回完成重新加载,要求重启时正常退出再打开。不要让用户安装 Git、Node.js、pnpm,也不要让 Agent 直接改小说文件或手工重命名数据目录。
9
9
 
10
10
  ## 更新流程
11
11
 
@@ -25,7 +25,7 @@ description: 安装或更新催更姬后,查询自动迁移、备份和完整
25
25
  返回当前插件版本、实际数据根、来源/目标存储版本、迁移阶段、完整备份路径、作品和正文数量,以及失败原因。它不要求会话绑定小说,迁移失败时仍可调用。
26
26
 
27
27
  ```json
28
- {"action":"verify","args":{"expectedVersion":"0.4.2","expectedDataRoot":"C:\\Users\\用户名\\AppData\\Local\\cuigengji"}}
28
+ {"action":"verify","args":{"expectedVersion":"0.4.4","expectedDataRoot":"C:\\Users\\用户名\\AppData\\Local\\cuigengji"}}
29
29
  ```
30
30
 
31
31
  它在锁内重新读取并校验工作库,返回计数、摘要哈希和每项检查结果。不要把摘要哈希当作正文内容,也不要把数据根替换成维护者电脑上的路径。
@@ -1,36 +1,36 @@
1
- import { persona } from './skills.js';
2
-
3
- const PERSONA_NAME = 'cuigengji:writing';
4
- const OWN_NAMES = new Set([PERSONA_NAME, 'cuigengji:handoff', 'cuigengji:preset', 'cuigengji:novel']);
5
-
6
- export function registerPrompt(ctx, { store, resolveBinding } = {}) {
7
- // Only author-enabled writing requirements join the stable persona. Story
8
- // content stays on demand; omit changing metadata to keep this text stable.
9
- ctx.on('system-prompt/assemble', async (assembly, context, next) => {
10
- const result = await next();
11
- if (!context.agent?.id) return result;
12
- context.signal?.throwIfAborted();
13
- const actor = { kind: 'agent', sessionId: String(context.agent.id) };
14
- let binding;
15
- try {binding = store && await (resolveBinding
16
- ? resolveBinding(actor.sessionId)
17
- : store.dispatch('binding.get', {}, actor));}
18
- catch (error) {
19
- if (error.code !== 'UPGRADE_REQUIRED') throw error;
20
- // A broken project must not prevent the host agent from calling the
21
- // unbound maintenance tool or the native plugin manager.
22
- return {...result,sections:result.sections.filter(entry => !OWN_NAMES.has(entry.name)),contexts:result.contexts.filter(entry => !OWN_NAMES.has(entry.name))};
23
- }
24
- const preset = binding ? await store.dispatch('preset.read', {}, actor) : null;
25
- context.signal?.throwIfAborted();
26
- return {
27
- ...result,
28
- sections: [
29
- ...result.sections.filter(entry => !OWN_NAMES.has(entry.name)),
30
- { name: PERSONA_NAME, text: persona, interpolate: false },
31
- ...(preset?.enabled && preset.content ? [{ name: 'cuigengji:preset', text: `作者的写作要求:\n${preset.content}`, interpolate: false }] : []),
32
- ],
33
- contexts: result.contexts.filter(entry => !OWN_NAMES.has(entry.name)),
34
- };
35
- });
36
- }
1
+ import { persona } from './skills.js';
2
+
3
+ const PERSONA_NAME = 'cuigengji:writing';
4
+ const OWN_NAMES = new Set([PERSONA_NAME, 'cuigengji:handoff', 'cuigengji:preset', 'cuigengji:novel']);
5
+
6
+ export function registerPrompt(ctx, { store, resolveBinding } = {}) {
7
+ // Only author-enabled writing requirements join the stable persona. Story
8
+ // content stays on demand; omit changing metadata to keep this text stable.
9
+ ctx.on('system-prompt/assemble', async (assembly, context, next) => {
10
+ const result = await next();
11
+ if (!context.agent?.id) return result;
12
+ context.signal?.throwIfAborted();
13
+ const actor = { kind: 'agent', sessionId: String(context.agent.id) };
14
+ let binding;
15
+ try {binding = store && await (resolveBinding
16
+ ? resolveBinding(actor.sessionId)
17
+ : store.dispatch('binding.get', {}, actor));}
18
+ catch (error) {
19
+ if (error.code !== 'UPGRADE_REQUIRED') throw error;
20
+ // A broken project must not prevent the host agent from calling the
21
+ // unbound maintenance tool or the native plugin manager.
22
+ return {...result,sections:result.sections.filter(entry => !OWN_NAMES.has(entry.name)),contexts:result.contexts.filter(entry => !OWN_NAMES.has(entry.name))};
23
+ }
24
+ const preset = binding ? await store.dispatch('preset.read', {}, actor) : null;
25
+ context.signal?.throwIfAborted();
26
+ return {
27
+ ...result,
28
+ sections: [
29
+ ...result.sections.filter(entry => !OWN_NAMES.has(entry.name)),
30
+ { name: PERSONA_NAME, text: persona, interpolate: false },
31
+ ...(preset?.enabled && preset.content ? [{ name: 'cuigengji:preset', text: `作者的写作要求:\n${preset.content}`, interpolate: false }] : []),
32
+ ],
33
+ contexts: result.contexts.filter(entry => !OWN_NAMES.has(entry.name)),
34
+ };
35
+ });
36
+ }