dsh-deepmoyu 2.3.0 → 2.4.2

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 (90) hide show
  1. package/AGENTS.md +93 -153
  2. package/CHANGELOG.md +36 -0
  3. package/CONTRIBUTING.md +51 -0
  4. package/CONTRIBUTORS.md +3 -7
  5. package/NOTICE.md +3 -3
  6. package/README.md +143 -81
  7. package/SECURITY.md +21 -0
  8. package/assets/screenshots/memory.png +0 -0
  9. package/assets/screenshots/menu.png +0 -0
  10. package/assets/screenshots/workspace.png +0 -0
  11. package/client.js +1404 -441
  12. package/cordis.patch.yml +1 -1
  13. package/docs/ASSETS.md +25 -0
  14. package/docs/DEPLOYMENT.md +102 -0
  15. package/docs/PRIVACY.md +32 -0
  16. package/docs/RELEASE_AUDIT.md +70 -0
  17. package/docs/RELEASING.md +94 -0
  18. package/docs/TEST_MATRIX.md +77 -0
  19. package/docs/assets-permissions.json +20 -0
  20. package/docs/tool-evidence.json +196 -0
  21. package/index.js +1095 -285
  22. package/lib/asr.py +41 -35
  23. package/lib/background-output.mjs +64 -17
  24. package/lib/background-tools.mjs +1 -0
  25. package/lib/companion.mjs +43 -0
  26. package/lib/config-policy.mjs +20 -0
  27. package/lib/favops.py +9 -2
  28. package/lib/ids.mjs +41 -0
  29. package/lib/login-session.mjs +34 -0
  30. package/lib/login.mjs +5 -4
  31. package/lib/mcp.mjs +3 -2
  32. package/lib/memory-center.mjs +74 -0
  33. package/lib/mode.mjs +6 -7
  34. package/lib/model-relay.mjs +5 -4
  35. package/lib/open-directory.mjs +93 -0
  36. package/lib/pace.mjs +92 -12
  37. package/lib/persona.mjs +46 -0
  38. package/lib/product-status.mjs +123 -0
  39. package/lib/prompts.mjs +40 -5
  40. package/lib/pv-production.mjs +280 -0
  41. package/lib/pv-session.mjs +316 -0
  42. package/lib/pv.mjs +398 -306
  43. package/lib/pv.py +84 -22
  44. package/lib/pv_cover.py +108 -26
  45. package/lib/pv_editorial.py +336 -0
  46. package/lib/pv_verify.py +267 -0
  47. package/lib/python-env.mjs +61 -0
  48. package/lib/reply.mjs +10 -3
  49. package/lib/run-settings.mjs +6 -0
  50. package/lib/sticker-automation.mjs +5 -4
  51. package/lib/sticker.mjs +135 -25
  52. package/lib/tool-scope.mjs +65 -0
  53. package/lib/update.mjs +265 -0
  54. package/lib/uvfetch.mjs +165 -153
  55. package/lib/verify.mjs +111 -127
  56. package/marketplace/pyyxzi__dsh-deepmoyu.yml +7 -0
  57. package/package.json +23 -12
  58. package/presets/deepmoyu.patch.yml +1 -1
  59. package/prompts/duty.md +4 -3
  60. package/screenshots.json +5 -0
  61. package/selfcheck.mjs +21 -6
  62. package/vendor/bilibili-mcp/requirements.in +9 -0
  63. package/vendor/bilibili-mcp/requirements.txt +1936 -11
  64. package/vendor/bilibili-mcp/runtime_guard.py +35 -10
  65. package/lib/__pycache__/pv.cpython-310.pyc +0 -0
  66. package/lib/__pycache__/pv_cover.cpython-310.pyc +0 -0
  67. package/tests/automation-routes.test.mjs +0 -183
  68. package/tests/automation.test.mjs +0 -79
  69. package/tests/background-tools.test.mjs +0 -182
  70. package/tests/background-window.test.mjs +0 -75
  71. package/tests/dup-cross-channel.test.mjs +0 -158
  72. package/tests/manual-browsing.test.mjs +0 -671
  73. package/tests/mcp-restart.test.mjs +0 -131
  74. package/tests/memory-chain.test.mjs +0 -413
  75. package/tests/model-relay.test.mjs +0 -116
  76. package/tests/persona.test.mjs +0 -67
  77. package/tests/pet-run-routes.test.mjs +0 -127
  78. package/tests/pet-run-settings.test.mjs +0 -38
  79. package/tests/pet-session.test.mjs +0 -125
  80. package/tests/pv-stage1.test.mjs +0 -203
  81. package/tests/sticker-routes.test.mjs +0 -141
  82. package/tests/sticker-upload-routes.test.mjs +0 -97
  83. package/tests/sticker-upload.test.mjs +0 -122
  84. package/tests/sticker.test.mjs +0 -169
  85. package/tests/test_guard_cross_channel.py +0 -141
  86. package/tests/test_pv_cover.py +0 -95
  87. package/tests/test_pv_stage1.py +0 -250
  88. package/tests/test_reply_pictures.py +0 -255
  89. package/tests/token-ledger.test.mjs +0 -78
  90. package/tests/verify_pv_sample.py +0 -91
package/cordis.patch.yml CHANGED
@@ -16,5 +16,5 @@
16
16
  - id: dafeiyu
17
17
  name: dsh-deepmoyu
18
18
  config:
19
- # 真正的用户配置在插件自己的 config 里(点桌宠 → ⚙️ 设置可改),这里只放默认值
19
+ # 用户配置由桌宠工作台管理,这里只声明 bundle 默认值。
20
20
  enabled: true
package/docs/ASSETS.md ADDED
@@ -0,0 +1,25 @@
1
+ # 素材与第三方组件
2
+
3
+ ## 代码
4
+
5
+ 项目代码遵循根 `LICENSE` 的 MIT 条款;`vendor/bilibili-mcp/` 保留单独的 MIT 许可证与署名。参见 [NOTICE.md](../NOTICE.md)。
6
+
7
+ ## 角色图片
8
+
9
+ 当前仓库包含以下既有角色素材:
10
+
11
+ - `assets/pet/pet.png`
12
+ - `assets/avatar/bust.png`
13
+ - `assets/avatar/face.png`
14
+ - `assets/avatar/fish.png`
15
+ - `assets/avatar/wide.png`
16
+
17
+ 维护者已于 2026-10-29 明确确认这些图片为原创或已获得公开分发授权,并要求保留现有形象;记录见 `docs/assets-permissions.json`。该记录是维护者的授权声明,不另行推断具体作者或第三方许可名称。代码的 MIT 许可不自动改变图片、角色或商标本身的权利范围。
18
+
19
+ `assets/screenshots/` 为当前插件真实界面的演示截图,使用合成数据,不代表真实账号、使用量或平台发送结果;其中出现的角色素材适用同一权限记录。
20
+
21
+ ## 外部服务和用户配置素材
22
+
23
+ - 插件不打包 GPT-SoVITS 模型、用户音色、参考音频、下载的表情或 B站图片。
24
+ - 用户配置的参考声音、模型与收集图片适用其各自的来源许可与平台要求。
25
+ - 在线语音、模型和 B站服务不是本项目附带的账号或额度;连接方式见 [隐私说明](PRIVACY.md)。
@@ -0,0 +1,102 @@
1
+ # 部署指南
2
+
3
+ ## 安装前
4
+
5
+ 确认 DSH 已能独立启动、模型可用,并确定要安装的 profile。下面使用 `web`,其他 profile 应替换名称。DSH 桌面版如果没有将 `dsh` 加入 PATH,应使用该安装提供的 CLI 启动方式;不要猜测另一份安装的位置。
6
+
7
+ 该 profile 必须是已配置的 Web/Desktop 组合,提供 `webServer` 和 `agentPresets`。`dsh plugin` 对一个全新名称创建的纯 base profile 不会自动变成 Web 应用;应先按 DSH 官方部署文档创建 Web/Desktop profile,再安装本插件。不要把本插件直接加到只含 base/headless 的 profile。
8
+
9
+ 包的引擎声明是版本范围,不是每个历史宿主都具备全部扩展能力的保证。角色工具要求会话作用域,视频制作要求模型选择及目标续轮/终态能力。工作台会按实际能力报告限制。
10
+
11
+ 工作台面向桌面版或本机浏览器访问。插件会拒绝其他网站、不同本机端口及非回环 Origin 的 API 请求;本轮不将公开网络反向代理访问列为已支持部署方式。不要为绕过限制关闭来源校验,也不要把没有宿主认证保护的 DSH 端口暴露到公网。
12
+
13
+ ## npm 正式版
14
+
15
+ ```sh
16
+ npm view dsh-deepmoyu version
17
+ dsh plugin --profile web add dsh-deepmoyu
18
+ ```
19
+
20
+ 需要固定版本时,先确认它确实已发布,再使用 `dsh-deepmoyu@<版本>`。本地源码版本或 GitHub 标签不会自动改变 npm registry。
21
+
22
+ ## 本地发布包
23
+
24
+ 下载维护者发布的 `.tgz` 和 `SHA256SUMS`,核对 SHA-256。PowerShell 可使用:
25
+
26
+ ```powershell
27
+ Get-FileHash -Algorithm SHA256 .\dsh-deepmoyu-2.4.2.tgz
28
+ dsh plugin --profile web add "C:\Downloads\dsh-deepmoyu-2.4.2.tgz"
29
+ ```
30
+
31
+ Linux/macOS 可使用:
32
+
33
+ ```sh
34
+ shasum -a 256 dsh-deepmoyu-2.4.2.tgz
35
+ dsh plugin --profile web add "/absolute/path/dsh-deepmoyu-2.4.2.tgz"
36
+ ```
37
+
38
+ 离线只有插件 tarball 仍不一定足够:首次安装需要解析其 npm 依赖,主 Python 工具链还需下载依赖。完全离线部署需预先准备对应平台的依赖缓存;项目不宣称一个 tarball 即覆盖全部离线依赖。
39
+
40
+ ## GitHub 或源码 ZIP
41
+
42
+ 克隆仓库,或解压带有 `package.json` 的源码包,进入该目录:
43
+
44
+ ```sh
45
+ npm ci --omit=dev
46
+ ```
47
+
48
+ PowerShell 本地链接:
49
+
50
+ ```powershell
51
+ $pluginPath = (Get-Location).Path
52
+ dsh plugin --profile web add "link:$pluginPath"
53
+ ```
54
+
55
+ Linux/macOS 本地链接:
56
+
57
+ ```sh
58
+ dsh plugin --profile web add "link:$(pwd)"
59
+ ```
60
+
61
+ 保持该源码目录存在,不要在链接安装后移动它。DSH 的插件命令管理 bundle 列表,普通部署不需要手工改 profile 的 JSON 或 junction。开发者安装 `npm ci` 可同时获得测试依赖。
62
+
63
+ ## 加载与首次配置
64
+
65
+ 1. 完全退出并重开 DSH,启动相同 profile。
66
+ 2. 单击桌宠 → 工作台 → 偏好与设置 → 账号与环境。
67
+ 3. 安装主依赖;插件使用独立 Python 环境,不写入宿主包目录。需要本地转写时另装可选依赖。
68
+ 4. 扫码登录并执行连接检查。
69
+ 5. 在运行方式中配置会话/后台各自的模型、时长和预算。
70
+ 6. 如需发送,单独启用相应权限;需要人工决定时同时开启发送前审核。
71
+
72
+ 普通对话不需要选择此模式,也不会获得角色工具。仅选中鲸鱼摸鱼模式不会自动开始浏览。
73
+
74
+ ## 升级与迁移
75
+
76
+ 先停止任务并备份 `<DSH_HOME>/bili-duty/`。npm 安装用户可安装已发布的新版本并重启。维护本地分叉时,应更新该源码 checkout 并安装锁定依赖,不应通过 registry 重装覆盖本地改动。
77
+
78
+ 从旧包名 `dsh-dafeiyu` 迁移时,先确认旧包与新包指向同一运行目录,停止旧实例并移除旧包的加载项,再安装新包。不要同时加载两份插件。内部 preset、HTTP 路由及状态文件沿用 `dafeiyu/feiyu` 标识,以兼容既有数据。
79
+
80
+ 不要用新建 profile、清空状态或删除判重数据库来处理普通升级错误。数据损坏与文件不存在是不同情况,先备份并检查日志。
81
+
82
+ ## 卸载与回滚
83
+
84
+ ```sh
85
+ dsh plugin --profile web remove dsh-deepmoyu
86
+ ```
87
+
88
+ 重启 DSH 后移除工作台与模式。运行数据保留;手动删除前先确认其中的凭证、记忆和视频是否需要备份。回滚代码时使用已验证的旧版本并保留数据备份;不承诺未来数据结构均可向旧版逆向兼容。
89
+
90
+ ## 故障定位
91
+
92
+ | 现象 | 检查项 |
93
+ | --- | --- |
94
+ | 没有桌宠 | 当前 profile 是否包含 bundle、插件是否激活、桌宠是否隐藏 |
95
+ | 菜单可见但接口 404 | 当前进程是否完全重启、包目录是否指向预期版本 |
96
+ | 角色工具不可用 | `toolScope` 诊断与宿主会话作用域能力 |
97
+ | 新会话创建失败 | 来源工作区、来源权限和所选模型是否有效 |
98
+ | Python 安装失败 | 安装日志、Python/uv 路径、下载源与完整性校验 |
99
+ | 视频失败 | 制作会话终态、独立任务日志、字体、配音和音视频校验 |
100
+ | 已开始但显示未计量 | 模型服务是否提供可信 usage;不要将缺失数据改为 0 |
101
+
102
+ 公开提交诊断前去除凭证、二维码、模型密钥、私信和个人路径。数据流见 [隐私说明](PRIVACY.md)。
@@ -0,0 +1,32 @@
1
+ # 数据与隐私
2
+
3
+ ## 本地保存
4
+
5
+ 插件运行目录为 `<DSH_HOME>/bili-duty/`,默认位于用户目录的 `.dsh/bili-duty/`。它包含配置、B站登录凭证、浏览与判重记录、学习队列、发送审核、用量、角色记忆、表情图片和本地视频产物。卸载插件包不等于删除这些数据。
6
+
7
+ 工作区记录镜像是另一份本地副本:当镜像功能已配置时,部分脱敏记录也会出现在所选工作区根目录。不要把自己的运行目录、工作区镜像或诊断附件直接提交到公开仓库。发布脚本只归档插件仓库中的源码文件,并拒绝已知运行数据与凭证文件。
8
+
9
+ ## 哪些数据可能离开本机
10
+
11
+ | 功能 | 接收方 | 发送的数据 |
12
+ | --- | --- | --- |
13
+ | 扫码登录与内容交互 | B站官方服务 | 登录流程数据、授权凭证,以及搜索、读取或已授权发送所需的参数 |
14
+ | 模型对话、后台浏览、学习审核与分镜编排 | 用户在 DSH 选择的模型服务 | 当前会话提示词、允许读取的工具结果和任务上下文;可能包含已批准记忆、评论或已授权读取的私信 |
15
+ | 默认视频配音 | `edge-tts` 使用的在线语音服务 | 待合成旁白及音色参数 |
16
+ | GPT-SoVITS 配音(可选) | 用户配置的本地环境 | 参考音频、对应文字和待合成旁白;该环境及其外部连接由用户自行配置 |
17
+ | 安装依赖与下载工具 | 配置的包源、官方分发源及下载镜像 | 下载请求所需信息;二进制完整性校验不等于对第三方服务行为作保证 |
18
+ | 链接收集表情 | 用户选择的公网图片来源 | 图片下载请求;来源地址受网络与格式校验 |
19
+
20
+ “凭证保存在本机”不表示账号请求从不携带凭证,也不表示模型或在线语音处理完全离线。本插件不设置独立的遥测或运行记录上传服务。
21
+
22
+ ## 对话隔离与控制
23
+
24
+ 普通会话不挂载角色工具或新增角色提示内容。切换模式不会删除已经存在的聊天历史。后台任务属于显式启动或已保存计划的独立任务,不因用户打开普通对话而获得该对话的人格或权限。
25
+
26
+ 评论、私信、动态、发送审核、学习审核、自动收集及自动配图具有各自的控制项。批准一条学习不等于授予公开发送权限。关闭审核也不会自动批准旧待审记录。
27
+
28
+ ## 导出、备份和删除
29
+
30
+ 退出 DSH 并确认后台任务已停止后,再备份完整运行目录。备份中可能含有效凭证,应按私人资料保存。界面中的“忘记”只影响对应记忆,不删除平台上已发布的内容;清空用量不清空永久判重。
31
+
32
+ 需要完全删除插件数据时,先卸载插件并停止所有相关进程,再自行删除 `<DSH_HOME>/bili-duty/` 和已配置的工作区镜像。不要删除整个 `<DSH_HOME>`,以免影响其他插件或 DSH 配置。
@@ -0,0 +1,70 @@
1
+ # 发布审查记录
2
+
3
+ 审查日期:2026-10-29。版本:2.4.2。结论:本轮发现的插件逻辑缺陷已修复,已完成下列功能、分发与安装验证。自动化测试和依赖审计不能证明不存在未知缺陷;外部服务、系统及模型边界单独列出。
4
+
5
+ ## 环境与证据类型
6
+
7
+ - 本机 Windows、Node.js 24.14.0、DSH Desktop 0.2.0-rc.2。
8
+ - 独立 CPython 3.11.18 和 3.12.10 环境;主依赖为全哈希锁,其中 Pillow 13.0.0、bilibili-api-python 17.4.2、mcp 1.30.0、edge-tts 7.3.1、imageio-ffmpeg 0.7.0。
9
+ - 浏览器使用真实 Chrome、React/ReactDOM 19.1.10 和合成数据。没有把截图演示或 mock 的发送回执写成真实账号行为。
10
+ - 真实宿主测试使用临时 profile、当前源码链接、从本机 app.asar 复制的实际依赖和回环模拟模型;不安装或覆盖实际用户 profile。
11
+ - 所有平台发送、账号读取和收藏写入的自动回归使用受控接口;本轮没有发送真实评论、私信、动态或收藏。
12
+
13
+ ## 验收结果
14
+
15
+ | 命令/门禁 | 实际结果 |
16
+ | --- | --- |
17
+ | `npm test` | host/client 自检与 387/387 Node 测试通过,0 失败、0 跳过 |
18
+ | `npm run test:python` / unittest discover | Python 3.11 全量 90/90,0 跳过;Python 3.12 主媒体/守卫测试及新增边车契约分别通过 |
19
+ | `npm run test:ui` | 997 条断言通过、0 失败;21/21 人为变异被捕捉 |
20
+ | `npm run test:browser` | 菜单 7 视口/42 次预览与动作清理;产品 26、竞态 9、记忆 18、页面矩阵 206、UID 往返 12 项通过 |
21
+ | `npm run test:isolation` | 人格隔离 103 条断言;真实宿主 goal driver 9 场景/54 条断言通过 |
22
+ | `host-tool-scope.test.mjs` | 显式指定本机真实宿主 archive 后 1/1 通过;无宿主的其他机器允许明确 skip,不能据此声称真实宿主已通过 |
23
+ | `npm run test:host` | 当前完整 bundle 与预设声明被真实宿主组合;普通请求有 24 个普通工具,0 个 bili 工具、0 个鱼人格标记 |
24
+ | `npm run test:mcp` | 真实 Python/FastMCP 握手、本地 SQLite 守卫调用及进程清理通过;无凭证、无平台调用 |
25
+ | 实际视频制作 | Pillow 13 环境完成封面→配音→1920×1080/30fps渲染→媒体校验→持久成片,见下节 |
26
+ | uv 下载 | 当前实现实际从官方来源获取校验值,流式下载/校验/解压/执行版本检查,得到 uv 0.13.6;另有15项隔离回归 |
27
+ | 主依赖审计 | 官方 npm audit:0 已知漏洞;pip-audit 2.10.1 对实际主 Python 环境:0 已知漏洞 |
28
+ | `release:check/build/smoke` | bundle、文档链接、38工具证据、素材授权摘要、截图、凭证模式、归档内容与清洁 tarball 安装通过 |
29
+
30
+ 全工具逐项证据见 [功能矩阵](TEST_MATRIX.md) 与 `tool-evidence.json`。387 项 Node 测试包含正向的全部 38 个工具、模式切出后的 76 次旧句柄拒绝、长 ID 原始 MCP 传输和各深层专项,不用无效参数拒绝来代替成功路径覆盖。
31
+
32
+ ## 发现与修复
33
+
34
+ | 范围 | 修复及验证 |
35
+ | --- | --- |
36
+ | 普通会话隔离 | 角色工具从根层改为会话作用域;显式退出、未知模式和残留鱼 goal 不再获得人格授权;根 registry 的旧适配器别名也在注册前拒绝 |
37
+ | 发送授权 | 模型配置工具不能开启发送、修改收件人、关闭审核或削弱预算/环境防护;force不构成授权;人工审核仍需原有发送开关允许 |
38
+ | 配置事务 | 锁内合并本次字段,修复多实例覆盖他人配置;严格拒绝畸形布尔、混合危险配置和不安全数字 UID |
39
+ | 长 ID | 浏览器文本输入、配置、工具、MCP原始JSON、回复和复核统一保持精度;不能从已舍入数字猜回目标 |
40
+ | 登录 | 二维码独立归属、旧请求不能覆盖新账号、网络操作有超时、凭证原子私密落盘 |
41
+ | 发送复核 | 有界分页、去环、重复合并、ID保真、损坏状态拒写、锁内合并与日报追加;登录态列表可见不再被描述为保证公开可见 |
42
+ | 后台隐私 | stdout/stderr、模型及工具错误只保留白名单元数据,不复制私信、请求正文或堆栈;处理UTF-8拆分和长行 |
43
+ | 下载与环境 | CPU/系统选择、官方摘要、大小/时限、独立暂存、实际可执行校验;Python3.11–3.13/Pillow13门禁、旧环境备份及失败恢复 |
44
+ | 可选转写 | 只清理本次下载、保留本地输入、同BV并发隔离;导入不修改全局临时目录;可选环境失败/中断不再假就绪 |
45
+ | 视频 | 修复编码器管道资源与失效的partial路径;明确目标的估时和实测不足60%时要求重编内容,不用静帧填时 |
46
+ | UI与目录 | 修复逻辑失败误报、首次称号误报、可访问名称、焦点循环、环境升级说明、旧响应覆盖;目录打开采用三平台无shell参数和退出确认 |
47
+ | 分发 | 主/开发依赖锁定,可移植QA进入Git根,运行manifest仅保留实际存在的check命令,源码ZIP保留开发流程,补齐隐私/部署/发布/素材与CI资料 |
48
+
49
+ ## 真实媒体验证
50
+
51
+ 独立 Pillow 13 / Python 3.12 环境使用当前 `createPv` 协调器实际执行。验收样片目标15秒、最低9秒;最终27.2秒、816/816帧、1920×1080、30fps、AAC,音频RMS约0.1012。四镜口型活动帧分别为137/128/160/145,两比例封面存在;回执的 `verifiedVideo` 指向实际存在的最终 `video.mp4`。首帧、中帧、末帧和封面已目视检查。
52
+
53
+ 时长是目标,不是逐帧固定长度;实际结果随旁白和语速变化。预览和正式制作均不接受严重不足的明确目标计划。媒体校验检查解码、非静音、时序、口型活动和产物存在性,不宣称已进行ASR逐字识别或主观听感认证。
54
+
55
+ ## 宿主、外部与平台边界
56
+
57
+ - 真实headless one-shot不组合角色预设:宿主门禁证明预设声明可组合和普通模式真实无泄漏;鱼模式工具挂载/退出由真实ScopedLayers源码、goal driver及独立模式测试验证,不冒称操作了当前GUI中的真实鱼会话。
58
+ - 基础支持对象为配置完整的本机Desktop/Web profile,须有 `webServer`、`agentPresets`。纯base/headless不能直接承载整个桌宠bundle;内部后台任务使用受控桥。
59
+ - macOS/Linux目录启动参数已自动测试,但本轮没有在这些桌面实机操作。CI提供Windows/Linux/macOS、Node22/24、Python3.11/3.12矩阵;配置文件已核验,尚未把未运行的远程CI写成已通过。
60
+ - 默认配音的实际样片使用在线语音服务;可选Whisper/yt-dlp和收藏边车为离线接口契约,未下载大型识别模型或执行真实收藏。用户自配GPT-SoVITS/GPU环境、参考音色和ASR识别质量未纳入主依赖审计。
61
+ - npm与主Python依赖审计是审查时快照,不是未来版本或所有可选用户环境的无漏洞保证。
62
+ - 没有重启正在使用的DSH;修改JS需要用户完全退出并重开后加载。没有更新真实profile、模型凭证、用户权限或删除运行历史。
63
+
64
+ ## 发布状态与复跑
65
+
66
+ 当前版本是本地待发布2.4.2。最终安装包与完整源码ZIP位于 `release/`,有逐文件验证报告和SHA-256;运行manifest删除开发命令是明确的发布投影,其他运行文件与源码逐字节核对。源码ZIP包含当前未提交的新文件,不混入历史工作区的旧包。
67
+
68
+ 安装包清洁安装使用临时家目录与生产依赖,执行包内 `check` 自检。依赖代码、媒体和界面文件调整后需重新构建归档。维护者可以在源码根运行README/CONTRIBUTING列出的全部命令;输出可由 `QA_OUTPUT_DIR`、`RELEASE_TMPDIR` 和 `DSH_QA_TMPDIR` 指定位置。
69
+
70
+ 市场所需条目、截图及客观描述已准备。GitHub仓库创建满一天的最早时间为 **2026-10-29 13:18:16(北京时间)**;此前外部年龄门禁不会放行。npm发布、GitHub上传与市场维护者审核尚未执行,不能由本地打包通过推断已发布或已收录,详见 [发布指南](RELEASING.md)。
@@ -0,0 +1,94 @@
1
+ # 发布指南
2
+
3
+ 源码、npm 包、GitHub Release 和插件市场条目是四个独立产物。本项目的构建命令不自动推送、发布 npm、创建 Release 或提交市场 PR。
4
+
5
+ ## 1. 准备源码
6
+
7
+ Git clone 已包含仓库元数据;从完整源码 ZIP 解压后,部署与一般测试可以直接运行,重新执行发布检查/打包前应在该源码根执行 `git init`,建立受控文件清单即可,不要求提交或设置远程仓库。归档故意不分发维护者的 `.git` 和认证信息。
8
+
9
+ - 更新 `package.json`、锁文件和 `CHANGELOG.md`,确认版本尚未被占用。
10
+ - 确认素材公开分发权限已记录在 [ASSETS.md](ASSETS.md) 与 `assets-permissions.json`。
11
+ - 核对 README、部署指南、隐私、安全报告入口和可复跑测试命令。
12
+ - 源码树不得包含运行数据、Cookie、模型密钥、`.npmrc` 或本机虚拟环境。
13
+
14
+ ```sh
15
+ npm ci
16
+ npm view dsh-deepmoyu version
17
+ ```
18
+
19
+ ## 2. 执行验收
20
+
21
+ ```sh
22
+ npm test
23
+ npm run test:python
24
+ npm run test:mcp
25
+ npm run test:ui
26
+ npm run test:browser
27
+ npm run test:isolation
28
+ npm run release:check
29
+ npm audit --registry=https://registry.npmjs.org
30
+ ```
31
+
32
+ Python 与浏览器依赖按 [贡献指南](../CONTRIBUTING.md) 配置。真实宿主门禁在提供本机 DSH 时执行;无宿主时的明确跳过不等于通过真实宿主验收。CI 只运行被明确隔离的测试,不读取账号,不发送平台消息。
33
+
34
+ 更新 [RELEASE_AUDIT.md](RELEASE_AUDIT.md),区分真实媒体、真实宿主实现、合成浏览器和 mock 外部服务。未通过的检查和无法验证的环境必须保留说明。
35
+
36
+ ## 3. 构建并测试实际归档
37
+
38
+ ```sh
39
+ npm run release:build
40
+ npm run release:smoke
41
+ ```
42
+
43
+ 产物位于忽略提交的 `release/`:
44
+
45
+ - `dsh-deepmoyu-<版本>.tgz`:npm/DSH 安装包,只包含运行文件、素材和用户文档。
46
+ - `dsh-deepmoyu-<版本>-source.zip`:可上传或解压开发的完整源码,包括锁文件、测试、CI 和发布资料。
47
+ - `SHA256SUMS`:两个归档的 SHA-256。
48
+ - `archive-verification.json`:文件数、归档哈希以及 npm 文件清单。
49
+
50
+ 构建从当前工作树获取已跟踪与未忽略的新文件,保留尚未提交的实现,不从旧 Git 提交生成过期 ZIP。源码 ZIP 逐文件回读并与当前源码比较;npm 包的 `package.json` 仅保留运行期 `check` 命令并移除开发依赖声明,其他文件逐字节核对。检查路径越界、符号链接、私有数据、常见凭证内容模式与缓存。清洁安装测试使用临时目录安装实际 tarball,并执行包内自检。
51
+
52
+ npm 运行包提供 `npm run check`;`npm test`、界面验收和发布命令仅在完整源码 checkout/ZIP 中提供。清洁验收还会解压源码 ZIP,在独立目录初始化 Git、执行 `npm ci`、发布清单检查及完整 Node 测试,证明不依赖维护者的上级工作区。可用 `RELEASE_TMPDIR` 或 `QA_OUTPUT_DIR` 指定临时目录。归档带有生成时间信息,不宣称两次构建的压缩字节完全一致;每次产物按其校验和验证。
53
+
54
+ 构建与审核之间如有任何源码修改,重新构建并执行清洁安装。不要上传历史工作区的旧 ZIP。
55
+
56
+ ## 4. GitHub 与 npm
57
+
58
+ 将经过审阅的源码提交到 `pyyxzi/dsh-deepmoyu`,确认 CI 结果后再创建对应版本标签和 Release。可以附加上一步的两个归档、校验和与审查记录。不要把 `release/` 归档作为源码提交进去。
59
+
60
+ npm 发布需要该包的发布权限和 registry 要求的认证。确认账号、版本、归档和发布目标后,再执行:
61
+
62
+ ```sh
63
+ npm whoami --registry=https://registry.npmjs.org
64
+ npm publish ./release/dsh-deepmoyu-<版本>.tgz --registry=https://registry.npmjs.org --access public
65
+ ```
66
+
67
+ 发布完成后查询指定版本的 `dist.integrity`、`dist.shasum` 和仓库信息,下载 registry tarball 并核对内容;本地构建通过不能替代发布后检查。npm 版本不可覆盖,不应为发布失败临时篡改归档内容。
68
+
69
+ ## 5. 插件市场
70
+
71
+ 按 2026-10-29 核对的官方贡献规则,将本仓库的
72
+ `marketplace/pyyxzi__dsh-deepmoyu.yml` 复制到目录仓库的
73
+ `data/plugins/pyyxzi__dsh-deepmoyu.yml`,提交只涉及该条目的 PR。
74
+
75
+ 需核对:
76
+
77
+ - 目标仓库公开可访问、创建至少满一天、仍在维护,并有 `dsh-plugin` topic。
78
+ - `package.json` 具有 `dsh.bundle`,声明的 patch 存在且能加载。
79
+ - 条目 URL、名称和代码仓库一致,功能描述客观准确,分类符合实际用途。
80
+ - 图标是 GitHub 托管的位图;根 `screenshots.json` 指向仓库内 1–8 张真实界面截图。
81
+ - 若条目已存在,更新该条目,不创建重复项。不要手改目录仓库自动生成的 README,也不要添加不支持的 `npm:` 字段。
82
+
83
+ npm 发布不是收录前提,也不会自动创建条目。目录 CI 与维护者审核是外部流程;本地打包不能证明已收录。
84
+
85
+ 规则来源:
86
+
87
+ - DSH 插件打包文档:<https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.md>
88
+ - 市场贡献指南:<https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/blob/main/contributing.md>
89
+
90
+ 提交前重新读取外部指南,以其当时规则为准。
91
+
92
+ ### 本轮查询的外部状态
93
+
94
+ 2026-10-29(北京时间)查询显示,本仓库公开、未归档、默认分支为 `main`,已有 `dsh-plugin` topic;目录中尚无本仓库条目。GitHub 返回的创建时间为 **2026-10-28 05:18:16 UTC**,因此满足“创建满一天”的最早时间为 **2026-10-29 13:18:16(北京时间)**。在此之前可准备并上传源码及发布包,市场目录的年龄门禁仍会拒绝提审。该状态是查询时快照,不是已收录声明。
@@ -0,0 +1,77 @@
1
+ # 功能与验收矩阵
2
+
3
+ 本表对应 2.4.2。完整结果和环境边界见 [发布审查记录](RELEASE_AUDIT.md)。测试中的“发送成功”是受控 MCP 的包装器契约,不代表向真实账号发送过内容。
4
+
5
+ ## 全部角色工具
6
+
7
+ `tests/tool-surface.test.mjs` 保存可执行的 `TOOL_SURFACE_EVIDENCE`。它校验注册工具清单与正向执行集合完全相等,并逐项核对有意义的输入、准确下游调用和返回字段;另外对全部工具执行普通模式和退出后的旧句柄拒绝检查。
8
+
9
+ | 工具 | 已验证的功能 |
10
+ | --- | --- |
11
+ | `bili_whoami` | 登录身份读取、完整长 MID |
12
+ | `bili_search` | 关键词、排序、范围/数量边界、已读过滤 |
13
+ | `bili_subtitle` | 字幕原文、时间参数、成功后已读记录 |
14
+ | `bili_danmaku` | 数量上限、时间聚合、样本与跳转 |
15
+ | `bili_buzzwords` | 热词、热度和图片字段映射 |
16
+ | `bili_video_info` | BV、作者、分 P、长 CID |
17
+ | `bili_rank` | 分区与榜单时间、已读过滤 |
18
+ | `bili_hot_videos` | 分页、上限与已读过滤 |
19
+ | `bili_user_videos` | 长 UID、分页、排序、关键词 |
20
+ | `bili_seen` | 补记与再次查询命中 |
21
+ | `bili_received_replies` | 长 rpid/root、回复资格 |
22
+ | `bili_my_notices` | 点赞、@ 与条数上限 |
23
+ | `bili_learn` | 新增待审、工具不能自行批准 |
24
+ | `bili_records` | 活动来源、稳定事件标识 |
25
+ | `bili_soul` | 指定章节追加和读回 |
26
+ | `bili_taste` | 统计与样本不足状态 |
27
+ | `bili_my_dynamics` | 动态列表、长 ID、评论状态 |
28
+ | `bili_opus_comments` | 长动态/评论标识与回复资格 |
29
+ | `bili_my_video_comments` | 视频/评论数量限制与本人评论排除 |
30
+ | `bili_reply_opus` | 开关允许后的受控发送与精确目标 |
31
+ | `bili_dm_inbox` | 收件箱、长 UID/消息序号、资格 |
32
+ | `bili_dm_thread` | 对话目标、消息数与消息标识 |
33
+ | `bili_dm_reply` | 当前资格核对、精确 UID/序号发送 |
34
+ | `bili_deliver` | 向已人工配置的目标投递 |
35
+ | `bili_comments` | 评论数量、正文、长评论/作者标识 |
36
+ | `bili_sticker` | 图库列表;上传/审核另有专项 |
37
+ | `bili_reply` | 评论包装器、纯文字与 BV 发送 |
38
+ | `bili_status` | 登录、权限、长 UID 与运行状态 |
39
+ | `bili_pace` | 指定通道的只读节奏状态 |
40
+ | `bili_say` | 有效旁白记录及来源关联 |
41
+ | `bili_run` | 受控后台启动与结束 |
42
+ | `bili_feiyu` | 建立、查询、暂停、恢复与清理自有目标 |
43
+ | `bili_pv` | 成片、制作任务及会话列表;制作另有实渲染 |
44
+ | `bili_moment` | 已授权后的受控动态发送 |
45
+ | `bili_login_start` | 本轮二维码与 key |
46
+ | `bili_login_poll` | 当前二维码完成与凭证私密持久化 |
47
+ | `bili_setup` | 安装流水线完成与真实运行校验状态 |
48
+ | `bili_config` | 安全偏好修改;人工授权字段不能被模型改变 |
49
+
50
+ ## 深层专项
51
+
52
+ | 功能范围 | 主要自动证据 |
53
+ | --- | --- |
54
+ | 模式、旧句柄与全局服务别名 | `mode-scope.test.mjs`、`tool-scope-alias.test.mjs`、`host-tool-scope.test.mjs`、两项人格/goal QA |
55
+ | 普通宿主会话不受影响 | `host-bundle-smoke.mjs` 真实 bundle/预设声明组合与回环模型普通请求 |
56
+ | 新会话、工作区和有效权限 | `pet-session.test.mjs`、`pet-run-routes.test.mjs`、`pet-run-settings.test.mjs` |
57
+ | 后台桥接、取消、计量 | `background-tools.test.mjs`、`model-relay.test.mjs`、`manual-browsing.test.mjs`、真实 headless relay |
58
+ | 时段、定时与恢复 | `automation*.test.mjs`、`background-window.test.mjs`、`product-status*.test.mjs` |
59
+ | 配置事务、授权与防护 | `config-safety.test.mjs`、`authorization.test.mjs`、`send-review-routes.test.mjs` |
60
+ | 登录与环境升级 | `login.test.mjs`、`python-env.test.mjs`、`install-routes.test.mjs` |
61
+ | 真实 Python MCP | `check-real-mcp.mjs`,实际 FastMCP 握手与本地 SQLite 守卫 |
62
+ | 节奏、永久判重及发送复核 | `pace*.test.mjs`、`dup-cross-channel.test.mjs`、`reply.test.mjs`、`verify*.test.mjs`、`test_guard_cross_channel.py` |
63
+ | 端到端长 ID | `mcp-ids.test.mjs`、`tool-surface.test.mjs`、`check-dm-uid-browser.cjs` |
64
+ | 学习、记忆与隐私 | `memory-chain.test.mjs`、`memory-center*.test.mjs`、`background-output.test.mjs` |
65
+ | 表情与图片 | `sticker*.test.mjs`、`test_reply_pictures.py`;包括格式、字节审核、公开地址、容量、取消和并发 |
66
+ | 账本、回顾与陪伴 | `token-ledger.test.mjs`、`product-status*.test.mjs`、`companion*.test.mjs` |
67
+ | 视频编排、终态与媒体 | `pv-*.test.mjs`、`test_pv_*.py`、实际配音/封面/渲染/校验全链 |
68
+ | 可选 ASR 与收藏边车 | `test_optional_sidecars.py`:本地输入保留、独占清理、同视频并发、参数与失败;外部服务为 fake |
69
+ | 桌宠与全部页面 | `check-ui.cjs`、六项浏览器 QA,含十个主/子页、三视口、菜单、记忆、请求竞态与 UID |
70
+ | 下载与供给链 | `uvfetch.test.mjs`、实际官方 uv 下载/校验;npm 与主 Python 依赖审计 |
71
+ | 分发完整性 | `release-contract.test.mjs`、`test_release_archives.py`、`release:check/build/smoke` |
72
+
73
+ ## 边界
74
+
75
+ - 代码行覆盖率不等于所有行为都已验证;矩阵与实际结果分别保留,不用测试总数替代功能证明。
76
+ - 真实平台发送、私人账号登录、GPU/用户自配音色和大型 Whisper 模型的识别质量,不通过本轮自动测试冒充验证。
77
+ - 目录打开已测三个平台的进程参数与故障行为,本机以外桌面未实机测试;GitHub CI 配置不等于远程 CI 已经运行。
@@ -0,0 +1,20 @@
1
+ {
2
+ "confirmedForRedistribution": true,
3
+ "status": "maintainer-attested",
4
+ "confirmedOn": "2026-10-29",
5
+ "basis": "The maintainer confirmed that these images are original or authorized for public redistribution and requested retaining the existing character artwork.",
6
+ "files": [
7
+ "assets/pet/pet.png",
8
+ "assets/avatar/bust.png",
9
+ "assets/avatar/face.png",
10
+ "assets/avatar/fish.png",
11
+ "assets/avatar/wide.png"
12
+ ],
13
+ "sha256": {
14
+ "assets/pet/pet.png": "263095b67bf3ba12cf165d30837c0c047350c999747c4a7a6a013712527a73db",
15
+ "assets/avatar/bust.png": "9c2e40aeea23bbebed32acca3f38d0b6eb90a30a24ea3d60d351dd67b2edf2dc",
16
+ "assets/avatar/face.png": "6e7e52685022a2a864ae85ca37bc09d92e3fe5d4be413e8f72d990f8e05a41e2",
17
+ "assets/avatar/fish.png": "82caa6641025e186077c20d58e7ba8c0c29b2fbc5a3638dbd02fce4fc13273e1",
18
+ "assets/avatar/wide.png": "3583a065a21640c03b990cc1b6b28ed1c3284cdb5d2a42cd8bd1a9237592873e"
19
+ }
20
+ }
@@ -0,0 +1,196 @@
1
+ {
2
+ "version": "2.4.2",
3
+ "scope": "Isolated positive contracts, not real platform sends",
4
+ "tools": [
5
+ {
6
+ "tool": "bili_whoami",
7
+ "category": "readonly",
8
+ "specialist": "login.test.mjs"
9
+ },
10
+ {
11
+ "tool": "bili_search",
12
+ "category": "readonly",
13
+ "specialist": "manual-browsing.test.mjs"
14
+ },
15
+ {
16
+ "tool": "bili_subtitle",
17
+ "category": "readonly",
18
+ "specialist": "manual-browsing.test.mjs"
19
+ },
20
+ {
21
+ "tool": "bili_danmaku",
22
+ "category": "readonly",
23
+ "specialist": "tool-surface.test.mjs"
24
+ },
25
+ {
26
+ "tool": "bili_buzzwords",
27
+ "category": "readonly",
28
+ "specialist": "manual-browsing.test.mjs"
29
+ },
30
+ {
31
+ "tool": "bili_video_info",
32
+ "category": "readonly",
33
+ "specialist": "tool-surface.test.mjs"
34
+ },
35
+ {
36
+ "tool": "bili_rank",
37
+ "category": "readonly",
38
+ "specialist": "manual-browsing.test.mjs"
39
+ },
40
+ {
41
+ "tool": "bili_hot_videos",
42
+ "category": "readonly",
43
+ "specialist": "manual-browsing.test.mjs"
44
+ },
45
+ {
46
+ "tool": "bili_user_videos",
47
+ "category": "readonly",
48
+ "specialist": "tool-surface.test.mjs"
49
+ },
50
+ {
51
+ "tool": "bili_seen",
52
+ "category": "local",
53
+ "specialist": "memory-chain.test.mjs"
54
+ },
55
+ {
56
+ "tool": "bili_received_replies",
57
+ "category": "readonly",
58
+ "specialist": "reply.test.mjs"
59
+ },
60
+ {
61
+ "tool": "bili_my_notices",
62
+ "category": "readonly",
63
+ "specialist": "memory-chain.test.mjs"
64
+ },
65
+ {
66
+ "tool": "bili_learn",
67
+ "category": "local",
68
+ "specialist": "memory-center-routes.test.mjs"
69
+ },
70
+ {
71
+ "tool": "bili_records",
72
+ "category": "local",
73
+ "specialist": "memory-chain.test.mjs"
74
+ },
75
+ {
76
+ "tool": "bili_soul",
77
+ "category": "local",
78
+ "specialist": "memory-center-routes.test.mjs"
79
+ },
80
+ {
81
+ "tool": "bili_taste",
82
+ "category": "local",
83
+ "specialist": "memory-chain.test.mjs"
84
+ },
85
+ {
86
+ "tool": "bili_my_dynamics",
87
+ "category": "readonly",
88
+ "specialist": "tool-surface.test.mjs"
89
+ },
90
+ {
91
+ "tool": "bili_opus_comments",
92
+ "category": "readonly",
93
+ "specialist": "dup-cross-channel.test.mjs"
94
+ },
95
+ {
96
+ "tool": "bili_my_video_comments",
97
+ "category": "readonly",
98
+ "specialist": "reply.test.mjs"
99
+ },
100
+ {
101
+ "tool": "bili_reply_opus",
102
+ "category": "send",
103
+ "specialist": "send-review-routes.test.mjs"
104
+ },
105
+ {
106
+ "tool": "bili_dm_inbox",
107
+ "category": "readonly",
108
+ "specialist": "background-tools.test.mjs"
109
+ },
110
+ {
111
+ "tool": "bili_dm_thread",
112
+ "category": "readonly",
113
+ "specialist": "manual-browsing.test.mjs"
114
+ },
115
+ {
116
+ "tool": "bili_dm_reply",
117
+ "category": "send",
118
+ "specialist": "background-tools.test.mjs"
119
+ },
120
+ {
121
+ "tool": "bili_deliver",
122
+ "category": "send",
123
+ "specialist": "send-review-routes.test.mjs"
124
+ },
125
+ {
126
+ "tool": "bili_comments",
127
+ "category": "readonly",
128
+ "specialist": "sticker-routes.test.mjs"
129
+ },
130
+ {
131
+ "tool": "bili_sticker",
132
+ "category": "local",
133
+ "specialist": "sticker-review-routes.test.mjs"
134
+ },
135
+ {
136
+ "tool": "bili_reply",
137
+ "category": "send",
138
+ "specialist": "send-review-routes.test.mjs"
139
+ },
140
+ {
141
+ "tool": "bili_status",
142
+ "category": "local",
143
+ "specialist": "product-status-routes.test.mjs"
144
+ },
145
+ {
146
+ "tool": "bili_pace",
147
+ "category": "local",
148
+ "specialist": "pace-routes.test.mjs"
149
+ },
150
+ {
151
+ "tool": "bili_say",
152
+ "category": "local",
153
+ "specialist": "manual-browsing.test.mjs"
154
+ },
155
+ {
156
+ "tool": "bili_run",
157
+ "category": "worker",
158
+ "specialist": "pet-run-routes.test.mjs"
159
+ },
160
+ {
161
+ "tool": "bili_feiyu",
162
+ "category": "goal",
163
+ "specialist": "pet-run-routes.test.mjs"
164
+ },
165
+ {
166
+ "tool": "bili_pv",
167
+ "category": "local",
168
+ "specialist": "pv-session-routes.test.mjs"
169
+ },
170
+ {
171
+ "tool": "bili_moment",
172
+ "category": "send",
173
+ "specialist": "send-review-routes.test.mjs"
174
+ },
175
+ {
176
+ "tool": "bili_login_start",
177
+ "category": "login",
178
+ "specialist": "login.test.mjs"
179
+ },
180
+ {
181
+ "tool": "bili_login_poll",
182
+ "category": "login",
183
+ "specialist": "login.test.mjs"
184
+ },
185
+ {
186
+ "tool": "bili_setup",
187
+ "category": "installer",
188
+ "specialist": "install-routes.test.mjs"
189
+ },
190
+ {
191
+ "tool": "bili_config",
192
+ "category": "local",
193
+ "specialist": "authorization.test.mjs"
194
+ }
195
+ ]
196
+ }