dsh-plugin 1.6.12 → 2.0.1

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 (131) hide show
  1. package/README.en.md +13 -13
  2. package/README.md +13 -13
  3. package/client/client.js +791 -761
  4. package/client/client.js.map +1 -1
  5. package/lib/http/catalog.js +2 -3
  6. package/lib/http/diagnostics.js +6 -7
  7. package/lib/http/install.js +47 -213
  8. package/lib/http/logs.js +1 -2
  9. package/lib/http/npm-release-age.js +42 -0
  10. package/lib/http/routes.js +8 -7
  11. package/lib/http/settings.js +2 -2
  12. package/lib/http/shared.js +2 -2
  13. package/lib/http/task.js +1 -2
  14. package/lib/index.js +5 -6
  15. package/lib/services/install/install-types.js +4 -4
  16. package/lib/services/install/install.js +1 -1
  17. package/lib/services/install/npm-check.js +3 -2
  18. package/lib/services/install/npm-resolve.js +9 -96
  19. package/lib/services/install/operation-log.js +53 -1
  20. package/lib/services/install/package-entry.js +6 -11
  21. package/lib/services/install/registry-check.js +2 -2
  22. package/lib/services/install/release-target.js +8 -9
  23. package/lib/services/install/task-queue.js +44 -48
  24. package/lib/services/npm-release-age.js +119 -0
  25. package/lib/services/probe.js +4 -4
  26. package/lib/services/profile/installed-versions.js +15 -21
  27. package/lib/services/profile/profile.js +16 -44
  28. package/lib/services/profile/progress.js +8 -11
  29. package/lib/services/settings.js +2 -5
  30. package/lib/types/http/catalog.d.ts +1 -1
  31. package/lib/types/http/install.d.ts +2 -2
  32. package/lib/types/http/npm-release-age.d.ts +2 -0
  33. package/lib/types/http/routes.d.ts +10 -12
  34. package/lib/types/http/shared.d.ts +5 -6
  35. package/lib/types/index.d.ts +7 -8
  36. package/lib/types/services/install/install-types.d.ts +12 -13
  37. package/lib/types/services/install/install.d.ts +1 -1
  38. package/lib/types/services/install/npm-resolve.d.ts +4 -16
  39. package/lib/types/services/install/operation-log.d.ts +9 -0
  40. package/lib/types/services/install/package-entry.d.ts +6 -11
  41. package/lib/types/services/install/release-target.d.ts +7 -8
  42. package/lib/types/services/install/task-queue.d.ts +25 -30
  43. package/lib/types/services/npm-release-age.d.ts +15 -0
  44. package/lib/types/services/probe.d.ts +4 -4
  45. package/lib/types/services/profile/installed-versions.d.ts +5 -7
  46. package/lib/types/services/profile/profile.d.ts +14 -18
  47. package/lib/types/services/profile/progress.d.ts +7 -10
  48. package/lib/types/services/settings.d.ts +0 -4
  49. package/package.json +1 -1
  50. package/src/client/components/PluginHubSection.tsx +26 -22
  51. package/src/client/components/catalog/CatalogList.tsx +2 -4
  52. package/src/client/components/catalog/PluginCard.tsx +2 -3
  53. package/src/client/components/layout/CatalogControls.tsx +5 -6
  54. package/src/client/components/layout/CatalogHeader.tsx +1 -2
  55. package/src/client/components/layout/CategoryTabs.tsx +2 -3
  56. package/src/client/components/layout/SectionTabs.tsx +3 -5
  57. package/src/client/components/modals/ConfirmDialog.tsx +4 -6
  58. package/src/client/components/modals/InstalledDetailModal.tsx +3 -6
  59. package/src/client/components/modals/LogsModal.tsx +7 -12
  60. package/src/client/components/modals/NotificationsModal.tsx +74 -24
  61. package/src/client/components/modals/ProgressView.tsx +3 -4
  62. package/src/client/components/modals/modals.tsx +75 -26
  63. package/src/client/components/ui/Dropdown.tsx +4 -6
  64. package/src/client/components/ui/Toggle.tsx +2 -3
  65. package/src/client/components/ui/icons.tsx +1 -2
  66. package/src/client/components/views/CustomInstallView.tsx +20 -178
  67. package/src/client/components/views/DiagnosticsView.tsx +3 -6
  68. package/src/client/components/views/InstalledView.tsx +6 -11
  69. package/src/client/components/views/MarketView.tsx +2 -4
  70. package/src/client/components/views/SettingsView.tsx +9 -32
  71. package/src/client/css-modules.d.ts +1 -1
  72. package/src/client/data/catalog.ts +2 -3
  73. package/src/client/data/host.ts +26 -3
  74. package/src/client/data/hub.ts +2 -3
  75. package/src/client/hooks/useCatalog.ts +79 -24
  76. package/src/client/hooks/useIncrementalList.ts +3 -5
  77. package/src/client/hooks/useLanguage.ts +4 -6
  78. package/src/client/hooks/useSettings.ts +4 -11
  79. package/src/client/hooks/useTaskQueue.ts +36 -42
  80. package/src/client/index.tsx +2 -3
  81. package/src/client/locales.ts +187 -114
  82. package/src/client/logic/constants.ts +1 -2
  83. package/src/client/logic/ensure-plugin-css.ts +8 -12
  84. package/src/client/logic/failures.ts +20 -19
  85. package/src/client/logic/format.ts +1 -1
  86. package/src/client/logic/install-command.ts +14 -35
  87. package/src/client/logic/installed.ts +15 -10
  88. package/src/client/logic/normalize.ts +3 -3
  89. package/src/client/logic/release-age.ts +19 -0
  90. package/src/client/logic/urls.ts +24 -21
  91. package/src/client/styles/CustomInstallView.module.css +3 -30
  92. package/src/client/styles/DiagnosticsView.module.css +3 -5
  93. package/src/client/styles/Dropdown.module.css +2 -4
  94. package/src/client/styles/Header.module.css +6 -7
  95. package/src/client/styles/InstalledView.module.css +4 -7
  96. package/src/client/styles/List.module.css +4 -5
  97. package/src/client/styles/LogsView.module.css +2 -3
  98. package/src/client/styles/Modal.module.css +46 -6
  99. package/src/client/styles/SectionTabs.module.css +2 -4
  100. package/src/client/styles/SettingsView.module.css +3 -5
  101. package/src/client/styles/Toggle.module.css +2 -4
  102. package/src/client/styles/tokens.module.css +14 -18
  103. package/src/client/types.ts +11 -11
  104. package/src/server/http/catalog.ts +2 -3
  105. package/src/server/http/diagnostics.ts +6 -7
  106. package/src/server/http/install.ts +47 -208
  107. package/src/server/http/logs.ts +1 -2
  108. package/src/server/http/npm-release-age.ts +42 -0
  109. package/src/server/http/routes.ts +12 -12
  110. package/src/server/http/settings.ts +2 -2
  111. package/src/server/http/shared.ts +5 -6
  112. package/src/server/http/task.ts +1 -2
  113. package/src/server/index.ts +7 -8
  114. package/src/server/services/install/install-types.ts +12 -13
  115. package/src/server/services/install/install.ts +0 -1
  116. package/src/server/services/install/npm-check.ts +3 -2
  117. package/src/server/services/install/npm-resolve.ts +9 -99
  118. package/src/server/services/install/operation-log.ts +47 -1
  119. package/src/server/services/install/package-entry.ts +6 -11
  120. package/src/server/services/install/registry-check.ts +2 -2
  121. package/src/server/services/install/release-target.ts +8 -9
  122. package/src/server/services/install/task-queue.ts +51 -54
  123. package/src/server/services/npm-release-age.ts +107 -0
  124. package/src/server/services/probe.ts +4 -4
  125. package/src/server/services/profile/installed-versions.ts +16 -22
  126. package/src/server/services/profile/profile.ts +16 -42
  127. package/src/server/services/profile/progress.ts +8 -11
  128. package/src/server/services/settings.ts +2 -9
  129. package/lib/services/install/preflight.js +0 -178
  130. package/lib/types/services/install/preflight.d.ts +0 -23
  131. package/src/server/services/install/preflight.ts +0 -184
@@ -3,7 +3,7 @@
3
3
  * Website: https://dsh-plugin.org
4
4
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5
5
  *
6
- * zh/en dictionaries for the DSH Plugin Hub settings section.
6
+ * 插件中心设置板块的 zh/en 字典。
7
7
  */
8
8
  export const zh = {
9
9
  nav: '插件市场',
@@ -47,39 +47,26 @@ export const zh = {
47
47
  viewSettings: '设置',
48
48
  viewMarketHint: '浏览与发现插件',
49
49
  viewInstalledHint: '管理已安装插件',
50
- viewCustomHint: '手动安装 NPM 包或 GitHub 源码',
50
+ viewCustomHint: '手动安装 NPM 包',
51
51
  viewSettingsHint: '网络通道与偏好设置',
52
52
  // 已安装视图
53
53
  installedEmpty: '还没有安装插件',
54
- installedEmptyDesc: '可以去「自定义安装」,手动安装 NPM 包或 GitHub 源码',
54
+ installedEmptyDesc: '可以去「自定义安装」,手动安装 NPM 包',
55
55
  npmInstallLabel: 'NPM 包 / 命令',
56
56
  npmInstallPlaceholder: 'npm install <包名> 或直接输包名',
57
57
  npmInstallExample: '支持原生命令:npm install lodash、npm i lodash、pnpm add @scope/pkg',
58
58
  npmInstallExample2: '全局安装 CLI:npm install -g @scope/cli;或直接输入包名 lodash',
59
59
  npmInstallInvalid: '请输入 npm 包名(如 lodash、@scope/pkg),或原生安装命令(如 npm install lodash、npm i lodash、pnpm add @scope/pkg、npm install -g @scope/cli)',
60
- gitInstallLabel: 'GitHub 源码',
61
- gitInstallPlaceholder: '输入仓库地址',
62
- gitInstallExample: '例如:owner/repo 或 https://github.com/owner/repo',
63
- gitInstallInvalid: '请输入 GitHub 仓库地址,例如:owner/repo 或 https://github.com/owner/repo',
64
- dshCmdLabel: 'DeepSeek Harness 命令',
65
- dshCmdPlaceholder: '粘贴官方 dsh plugin 命令',
66
- dshCmdInsertHubUpdate: '插入更新命令',
67
- // 示例/校验文案里的 profile 用运行时当前宿主 profile 渲染({profile} 占位符),
68
- // 不写死 web —— 桌面端当前 profile 是 desktop,照抄写死的 web 会装进宿主永不加载的档
69
- dshCmdExample: '例如:dsh plugin --profile {profile} add github:owner/repo,或 dsh plugin --profile {profile} update dsh-plugin',
70
- dshCmdInvalid: '请输入官方 dsh plugin 命令(--profile 必填,支持 add / update)。例如:dsh plugin --profile {profile} update dsh-plugin',
71
60
  installHelp: '帮助',
72
61
  helpModalTitle: '支持的命令格式',
73
62
  npmInstallHelp: 'lodash、@scope/pkg\t直接输入包名\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli\t全局安装 CLI 工具,不进「已安装」列表',
74
- gitInstallHelp: 'owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git',
75
- dshCmdHelp: 'dsh plugin --profile {profile} add <目标>\t安装\ndsh plugin --profile {profile} update <目标>\t更新已安装目标到最新版本\ndsh plugin --profile={profile} add <目标>\ndsh plugin --profile={profile} update <目标>\n\t--profile 必填(此处已填当前 profile),官方 CLI 无 -p 简写;<目标> 可为 npm 包名或 github:owner/repo;卸载请用「已安装」列表',
76
63
  globalNpmHint: '将全局安装 CLI 工具(npm install -g),不会出现在「已安装」列表,无需重启宿主',
77
64
  installCliBtn: '安装',
78
65
  // 安装通道关闭(安全信任开关关掉后,对应卡片禁用并引导去设置打开)
79
66
  channelDisabledHint: '该安装通道已关闭,请在「设置 → 安全信任」中打开开关',
80
67
  goToSettings: '前往设置',
81
68
  // 自定义安装视图:独立一级导航,说明文字
82
- customViewDesc: '手动安装目录外的 NPM 包、GitHub 源码,或粘贴官方 dsh plugin 命令。装完的条目会出现在「已安装」列表,并标记为自定义安装。',
69
+ customViewDesc: '手动安装目录外的 NPM 包。装完的条目会出现在「已安装」列表,并标记为自定义安装。',
83
70
  customLabel: '自定义安装',
84
71
  installedSearch: '搜索已安装的插件…',
85
72
  installedFilterCatalog: '目录插件',
@@ -134,13 +121,9 @@ export const zh = {
134
121
  mirrorTencent: '腾讯云镜像',
135
122
  mirrorTsinghua: '清华大学 TUNA 镜像',
136
123
  settingsSecurity: '安全信任',
137
- settingsSecurityDesc: '命令行安装的三个通道开关:NPM 包、GitHub 源码与 DSH 命令',
124
+ settingsSecurityDesc: '命令行安装的开关:NPM 包',
138
125
  settingsEnableNpm: '启用 NPM 安装',
139
126
  settingsEnableNpmDesc: '允许通过命令行安装 npm 包;关闭后输入包名安装会被拦截',
140
- settingsEnableGit: '启用 GitHub 源码安装',
141
- settingsEnableGitDesc: '允许通过命令行安装 GitHub 源码;关闭后输入仓库地址安装会被拦截',
142
- settingsEnableDsh: '启用 DSH 命令安装',
143
- settingsEnableDshDesc: '允许通过命令行粘贴 dsh plugin 命令安装;关闭后命令输入会被禁用',
144
127
  settingsDiagnostics: '系统诊断',
145
128
  settingsDiagnosticsDesc: '检测 npm 源 / GitHub / 目录站点等安装通道的连通状态',
146
129
  settingsLogs: '系统日志',
@@ -319,7 +302,7 @@ export const zh = {
319
302
  failCopy: '复制完整错误信息',
320
303
  failIssueHint: '带着错误日志去作者仓库一键提交 Issue(正文含官网收录链接)',
321
304
  failIssueBig: '一键提交 BUG 到 GitHub Issue 为开源作贡献',
322
- // 非插件侧失败(未知原因 / pnpm allowBuilds 拦截)改为引导到插件中心仓库排查
305
+ // 非插件侧失败(未知原因)改为引导到插件中心仓库排查
323
306
  failHubIssueHint: '此失败已被判定为环境或插件中心自身问题(非插件作者问题),带着错误日志到插件中心仓库一键提交 Issue',
324
307
  failHubIssueBig: '反馈给插件中心排查',
325
308
  // 未知失败兜底:不归到插件作者,引导到插件中心仓库排查
@@ -331,20 +314,21 @@ export const zh = {
331
314
  failProfileLockHint: 'DSH 在写入插件清单时等不到文件锁、超时中止 —— 通常是同时有另一个 DSH 进程或安装任务在写同一个 profile(也可能是上一次的进程没退干净留下的锁)。请先关掉其他 dsh 窗口或正在跑的命令,再重试一次;若反复出现,重启一次 DSH。这不是插件本身的问题,也不需要重复{action}。',
332
315
  // 宿主自身入口起不来:环境问题,给提示、不引导提 Issue
333
316
  failHostCliSpawnHint: 'DSH 没能启动自身来完成这次操作(系统报「找不到可执行文件」):通常是因为 DSH 的安装目录被移动或正在更新,或该 profile 目录还不存在。请重启一次 DSH 后重试;若反复出现,重新安装 DSH。这不是插件本身的问题,换别的插件也一样。',
334
- // prepare 构建脚本实际执行失败(git 分发缺子模块/构建产物):插件打包分发问题,应提 Issue
335
- failPrepareHint: '该插件安装时的构建脚本执行失败(git 分发常缺失子模块或构建产物),属插件打包分发问题。请向作者仓库提交 Issue 反馈。',
336
- // 「插件打包问题」分支的次要入口:该判据由插件中心自己的预检/装后校验产出(不是 pnpm 原文),
317
+ // prepare 构建脚本实际执行失败:插件打包分发问题,应提 Issue
318
+ failPrepareHint: '该插件安装时的构建脚本执行失败(npm 分发物不完整),属插件打包分发问题。请向作者仓库提交 Issue 反馈。',
319
+ // 「插件打包问题」分支的次要入口:该判据由插件中心自己的装后校验产出(不是 pnpm 原文),
337
320
  // 一旦误报,用户会被引导去作者仓库、插件中心永远收不到反馈 —— 故留一条反馈路径
338
321
  failMisjudgeHint: '如果这个插件其实能正常安装(上面这个判定是插件中心误报的),请反馈给插件中心:文字提示里的判据由市场自身产出,误报只有靠你的反馈才能被发现。',
339
322
  failMisjudgeLink: '插件能装却被拦下?反馈给插件中心',
340
- // 安装前预检 / 装后校验拦截([packaging]):git 分发缺插件需要的文件(入口 / 补丁 mount 的入口 / bundle 补丁)= 插件未适配官方默认安装方式
341
- failPackagingHint: '该插件不支持官方默认安装方式:其 git 分发缺少它需要的文件(`main` / `exports` 声明的入口、补丁按本包名 mount 的入口,或 `dsh.bundle.patch` 声明的补丁),说明作者未适配官方安装流程。请到作者仓库提交 Issue 反馈,请其提交构建产物、改用预构建 release `.tgz` 直链(`releases/download/<tag>/<asset>.tgz`),或发布完整的 npm 版。',
342
- // 原生依赖构建脚本被 pnpm 默认拦截(如 node-pty 的 ERR_PNPM_IGNORED_BUILDS):不单独算插件问题,引导到插件中心仓库排查
343
- failIgnoredBuild: '该插件(或其依赖)需要在安装时执行构建脚本,被 pnpm 的安全白名单(allowBuilds)默认拦截,本次操作因此失败(如原生模块 node-pty,或 git 安装时插件自己的 prepare 脚本)。安装器已自动放行该 key 并重试过一次;仍失败通常说明构建本身没通过。可先在终端手动执行一次安装命令查看完整构建错误;若确属插件的构建/分发问题,建议作者预置构建产物、发布 npm 包或预构建 .tgz。需要协助排查时也可反馈给插件中心。',
323
+ // 装后校验拦截([packaging]):npm 分发物缺插件需要的文件(入口 / 补丁 mount 的入口 / bundle 补丁)= 插件分发不完整
324
+ failPackagingHint: '该插件的 npm 分发物不完整:缺少它需要的文件(`main` / `exports` 声明的入口、补丁按本包名 mount 的入口,或 `dsh.bundle.patch` 声明的补丁)。请到作者仓库提交 Issue 反馈,请其发布包含完整构建产物的 npm 包。',
325
+ // 原生依赖构建脚本被 pnpm 默认拦截(如 node-pty 的 ERR_PNPM_IGNORED_BUILDS):插件的依赖需在用户机器上编译原生模块,
326
+ // 自动放行 allowBuilds 重试一次仍失败即任何用户都装不上 —— 属作者侧,引导到作者仓库提 Issue
327
+ failIgnoredBuild: '该插件(或其依赖)需要在安装时执行构建脚本,被 pnpm 的安全白名单(allowBuilds)默认拦截,本次操作因此失败(如原生模块 node-pty,或 git 安装时插件自己的 prepare 脚本)。安装器已自动放行该 key 并重试过一次;仍失败说明构建本身没通过、任何用户都装不上。可先在终端手动执行一次安装命令查看完整构建错误;这属插件的构建/分发问题,请到作者仓库反馈:建议作者预置构建产物、发布含构建产物的 npm 包或提供预构建 .tgz。',
344
328
  // npm arborist 内部崩溃(edgesOut)+ 本机 npm 版本过低:npm 自身已知缺陷,不是插件问题,升级 npm 即可
345
329
  failNpmTooLow: '怀疑本机 npm 版本过低:npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest',
346
330
  failNpmTooLowV: '本机 npm 版本过低(当前 v{v}):npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest',
347
- // 安装前连通性预检 / 安装日志里的连接失败([network] / git fetch 超时 / DNS / TLS):本机网络或代理问题,不是插件问题,不引导提 Issue
331
+ // 安装前连通性探测 / 安装日志里的连接失败([network] / 连接超时 / DNS / TLS):本机网络或代理问题,不是插件问题,不引导提 Issue
348
332
  failNetworkHint: '{action}前检测到网络不通:无法连接到安装源(可能是断网、DNS 解析失败、被防火墙拦截,或代理配置有问题)。这不是插件本身的问题 —— 请检查网络连接,或到「设置」里确认 HTTP 代理配置,再到「系统诊断」运行一次连通性检测,然后重试。',
349
333
  // 网络失败弹窗里的「无法访问 …」醒目行:直接告诉用户具体哪个地址连不上({url} 为提取的不可达地址)
350
334
  failNetworkRegistryHint: '你的 npm/pnpm 源(registry)被配置为 {host},插件包需从该源下载但失败了。这通常是内网/自定义源没有同步该包(或需要内网认证)—— 请把 npm/pnpm 的 registry 指回官方源 https://registry.npmjs.org(或确认此源可访问该包)后重试。',
@@ -366,6 +350,62 @@ export const zh = {
366
350
  failRegistryMirrorLagHint: '安装器调用 pnpm 时报「包不存在」(ERR_PNPM_FETCH_404):该包在官方 npm 源上是有的,但你本机配置的 npm/pnpm 源(registry 或镜像)没有同步到它。请把 npm/pnpm 的 registry 指回官方源 https://registry.npmjs.org(或换一个已同步该包的镜像)后重试。这不是插件本身的问题。',
367
351
  failPluginMissingDepTarget: '{pkg} 在官方 npm 源上不存在',
368
352
  failPluginMissingDepHint: '该插件依赖的包在官方 npm 源上并不存在(已删除或从未发布):这是插件作者侧的依赖问题,不是你环境的问题。请向插件作者仓库反馈,请作者补上或修正该依赖,或改为随插件一起分发。',
353
+ failHostIncompatibleKind: '插件不支持当前的 DSH 版本',
354
+ failHostIncompatibleReason: '当前 DSH {version} 不在该插件的兼容清单里,宿主在安装前就拒绝了 —— 什么都没装。',
355
+ failHostIncompatibleHint: '① 请作者把该版本加入兼容清单后发新版(下方按钮直达作者仓库)\n② 在桌面应用的插件管理器里为这个精确版本授权(宿主会提示崩溃/数据风险)',
356
+ // 统一失败卡片头部:报错类型标题 + 一句话原因(每类各自的详细指引见 fail*Hint)
357
+ failKind_npmTooOld: '本机 npm 版本过低',
358
+ failReason_npmTooOld: '当前 npm 版本处理不了这个包的依赖树,安装被中断。',
359
+ failKind_dshMissing: '本机缺少 dsh',
360
+ failReason_dshMissing: '安装器需要调用 dsh,但在你的机器上找不到它。',
361
+ failKind_gitMissing: '本机缺少 git',
362
+ failReason_gitMissing: '这个包的依赖需要 git,但机器上找不到 git。',
363
+ failKind_pnpmMissing: '本机缺少 pnpm',
364
+ failReason_pnpmMissing: '安装器通过 pnpm 安装插件,但机器上找不到 pnpm。',
365
+ failKind_npmMissing: '本机缺少 npm',
366
+ failReason_npmMissing: '安装流程需要 npm,但机器上找不到它。',
367
+ failKind_pnpmStore: 'pnpm store 版本不匹配',
368
+ failReason_pnpmStore: 'profile 里的依赖由另一大版本的 pnpm 生成,当前 pnpm 不认。',
369
+ failKind_pnpmWorkspace: 'workspace 根校验阻止了安装',
370
+ failReason_pnpmWorkspace: 'profile 被当作 workspace 根,但没有声明根操作,pnpm 中止了安装。',
371
+ failKind_originRejected: '本地服务的来源校验未通过',
372
+ failReason_originRejected: '请求根本没进安装流程:本地服务拒绝了它的来源。',
373
+ failKind_pnpmPolicy: '被 pnpm 供应链策略拦截',
374
+ failReason_pnpmPolicy: '版本未满最小发布年龄,或缺完整性校验 / 来源不可信。',
375
+ failKind_pnpmUnusedPatch: 'profile 残留旧补丁声明',
376
+ failReason_pnpmUnusedPatch: 'profile 里留着指向旧版本 dsh-plugin 的补丁,pnpm 出于安全中止了安装。',
377
+ failKind_pnpmMissingDep: '依赖包在 registry 上不存在',
378
+ failReason_pnpmMissingDep: 'profile 里有一条指向未发布包的依赖,pnpm 每次解析都卡在它上面。',
379
+ failKind_pluginMissingDep: '插件依赖未发布',
380
+ failReason_pluginMissingDep: '插件声明依赖的包在官方 npm 源上不存在(已删除或从未发布)。',
381
+ failKind_registryVersionStale: '该版本在所用源上不存在',
382
+ failReason_registryVersionStale: '实际安装用的源还没同步到这个版本,或版本号写错。',
383
+ failKind_pnpmLinkedDirMissing: 'profile 里有失效的本地依赖',
384
+ failReason_pnpmLinkedDirMissing: '有一条指向本机不存在目录的 link/file 依赖,pnpm 每次解析都卡住。',
385
+ failKind_fileLocked: '文件被其他程序占用',
386
+ failReason_fileLocked: 'pnpm 无法替换 profile 里的文件:有程序正持有它。',
387
+ failKind_accessDenied: '没有写入权限',
388
+ failReason_accessDenied: '系统拒绝 pnpm 写入 profile 里的文件。',
389
+ failKind_fsUnavailable: '磁盘不可写',
390
+ failReason_fsUnavailable: '磁盘已满、处于只读,或文件句柄耗尽。',
391
+ failKind_pnpmIgnoredBuild: '原生模块构建被拦截',
392
+ failReason_pnpmIgnoredBuild: '插件依赖需要在你的机器上现场编译,pnpm 默认拦住构建脚本。',
393
+ failKind_pluginPrepare: '插件分发不完整',
394
+ failReason_pluginPrepare: '作者发布的包里缺文件,或构建脚本执行失败。',
395
+ failKind_hostIncompatible: '插件不支持当前的 DSH 版本({version})',
396
+ failReason_hostIncompatible: '插件声明的兼容清单里没有你正在运行的 DSH 版本。',
397
+ failKind_network: '网络连接失败',
398
+ failReason_network: '安装过程中连不上 npm 源或代理,请求没有完成。',
399
+ failKind_hostCliSpawn: '无法启动 DSH 宿主',
400
+ failReason_hostCliSpawn: '解析到的宿主入口起不来,安装命令没有真正执行。',
401
+ failKind_hubState: '插件中心状态不同步',
402
+ failReason_hubState: '本地记录的安装状态与实际不一致,这次操作没有生效。',
403
+ failKind_timeout: '操作超时',
404
+ failReason_timeout: '安装耗时超过上限仍未完成,已经中止。',
405
+ failKind_profileLock: 'profile 被其他进程占用',
406
+ failReason_profileLock: '另一个 dsh 进程正在使用这个 profile。',
407
+ failKind_hub: '出现未知错误',
408
+ failReason_hub: '我们还没能识别这条报错,你可以一键反馈给我们。',
369
409
  failRegistryVersionStaleHint: '安装器调用 pnpm 时报「找不到匹配的版本」(ERR_PNPM_NO_MATCHING_VERSION):要装的这个版本在实际执行安装的 npm 源里查不到。常见原因是你设置的 npmRegistry 与本机 ~/.npmrc 用的不是同一个源——官方源刚发布、镜像还没同步上来(快则几分钟、慢则几小时),也可能只是版本号写错了。这不是插件本身的问题。可在插件市场设置里把 npmRegistry 改成与本机 ~/.npmrc 一致(或反过来),或那一次显式走官方源(https://registry.npmjs.org)、改用离线包后重试;若该版本刚发布不久,等镜像同步后重试即可。',
370
410
  failPnpmLinkedDirMissingHint: '安装器调用 pnpm 时报「要安装的目录不存在」(ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND):你的 profile 里留着一条指向本机不存在目录的本地依赖(link: / file: 形式,例如用 dsh plugin add <本地路径> 装过开发中的插件,之后那个目录被删除或移动了)。pnpm 每次解析 profile 依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 package.json 里删除该本地依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件),或把该目录恢复回原路径后重试。',
371
411
  failFileLockedHint: '安装过程中 pnpm 无法替换 profile 里的文件:有程序正占用着它(Windows 常见报错 os error 32「另一个程序正在使用此文件」)。通常是 DeepSeek Harness 自身或杀毒软件的实时扫描持有文件句柄。这不是插件本身的问题——请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试。',
@@ -377,10 +417,8 @@ export const zh = {
377
417
  // minimumReleaseAge 专属:从报错里算出确切的可重试时刻({time}),让用户知道「何时能再装」,
378
418
  // 而不是笼统地让等 24 小时
379
419
  failPnpmReleaseAgeHint: '安装器调用 pnpm 时被其供应链安全策略拦住了,任何插件装进这个 profile 都会先撞上它——与插件本身无关。原因是这个包发布还不满 24 小时,pnpm 11 出于安全会拒收刚发布的新包,这段时间内该 profile 的安装与卸载都会被拦下。可重试时间:{time}(即该包发布满 24 小时后)。如确需立刻安装,可在 profile 目录(~/.dsh/profiles/<profile>)的 pnpm-workspace.yaml 里加 minimumReleaseAge: 0 豁免,但这会放宽整个 profile 的供应链保护。',
380
- // 自定义安装三卡片入口的渠道名(报错/日志溯源:本次安装从哪个入口发起)
420
+ // 自定义安装入口的渠道名(报错/日志溯源:本次安装从哪个入口发起)
381
421
  installChannelNpm: 'NPM 包',
382
- installChannelGit: 'GitHub 源码',
383
- installChannelDsh: 'DSH 命令',
384
422
  // 报错/通知中心的入口溯源行:前缀在错误正文顶部,精准指出自定义安装是从哪张卡片发起的
385
423
  installEntryLine: '安装入口:{c}。',
386
424
  reportIssue: '去插件仓库提交 Issue',
@@ -427,7 +465,7 @@ export const zh = {
427
465
  export const en = {
428
466
  nav: 'Plugin Hub',
429
467
  title: 'DSH Plugin Hub',
430
- // Plugin counts are filled from the live /api/stats.json ({total}/{verified}), never hardcoded
468
+ // 收录/精选数量由组件从实时 /api/stats.json({total}/{verified})填充,不写死
431
469
  tagline: 'DSH Plugin Hub: a human-verified, free marketplace for DeepSeek Harness plugins',
432
470
  adBadge: 'Featured',
433
471
  ad: 'DSH Plugin Hub: {total} plugins indexed, {verified} human-verified, updated daily',
@@ -444,59 +482,48 @@ export const en = {
444
482
  fork: 'Fork',
445
483
  loading: 'Loading plugin data…',
446
484
  failed: 'Failed to load plugin data',
447
- // Precise hints when the catalog cannot load: distinguished by whether a proxy is configured
485
+ // 目录加载失败时的精准提示:按是否配置了代理区分
448
486
  failedDescNoProxy: 'Your network seems unreachable, so the plugin catalog could not be loaded. Please check your connection and retry; or open the hub in your browser with the button above.',
449
487
  failedDescProxy: 'Your network seems unreachable, or the HTTP proxy in Settings is unreachable, so the plugin catalog could not be loaded. Please check the proxy address and your connection, then retry; or open the hub in your browser with the button above.',
450
488
  retry: 'Retry',
451
489
  install: 'Install',
452
- // Plugins that must be installed by hand (webInstallable=false): one wording for both cases —
453
- // the web UI cannot run the command at all (npx installers, local links), or it can run it but
454
- // the install needs terminal-side work (repos with a prepare build hook, sub-directory assembly).
490
+ // 需在终端手动安装的插件(webInstallable=false):两种情形共用一套措辞 ——
491
+ // 网页端完全跑不了该命令(npx 安装器 / 本地 link),或能跑但装机过程要在终端完成
492
+ //(仓库带 prepare 构建钩子、需要装配子目录)。
455
493
  cliOnlyHint: 'This plugin has to be installed in your dsh terminal (the web UI cannot run the build or assembly steps it needs) — copy the command above and run it there',
456
- // Manual-intervention flag (manualInstall): the install needs a build / step-by-step assembly in the terminal.
457
- // The key cannot be manualInstallHint — that one is the source filter on the Installed page.
494
+ // 人工干预标记(manualInstall):安装要在终端里跑构建/分步装配,网页一键安装替不了终端。
495
+ // 注意 key 不能叫 manualInstallHint —— 那个是「已安装」页来源筛选的文案(目录插件 / 手动安装)。
458
496
  manualInstallOnlyHint: 'This plugin has to be installed by hand in your dsh terminal — one-click install from the web UI cannot run the build and assembly steps it needs. Copy the command above and run it there (Git Bash or PowerShell on Windows, Terminal on macOS/Linux); the author\'s repo has the full steps.',
459
497
  failedCopyHint: 'Install failed. Copy the command above and run it manually in your dsh terminal (native build scripts may need manual approval, e.g. pnpm approve-builds)',
460
498
  toastCopied: 'Install command copied — paste it in your dsh terminal',
461
499
  installed: 'Installed',
462
- // Primary navigation: Market / Installed / Custom / Settings
500
+ // 一级导航:插件市场 / 已安装 / 自定义安装 / 设置
463
501
  viewMarket: 'Market',
464
502
  viewInstalled: 'Installed',
465
503
  viewCustom: 'Custom',
466
504
  viewSettings: 'Settings',
467
505
  viewMarketHint: 'Browse and discover plugins',
468
506
  viewInstalledHint: 'Manage installed plugins',
469
- viewCustomHint: 'Install npm packages or GitHub sources manually',
507
+ viewCustomHint: 'Install npm packages manually',
470
508
  viewSettingsHint: 'Network sources and preferences',
471
- // Installed view
509
+ // 已安装视图
472
510
  installedEmpty: 'No plugins installed yet',
473
- installedEmptyDesc: 'Go to Custom to add an npm package or GitHub source manually',
511
+ installedEmptyDesc: 'Go to Custom to add an npm package manually',
474
512
  npmInstallLabel: 'npm package / command',
475
513
  npmInstallPlaceholder: 'npm install <pkg> or a bare package name',
476
514
  npmInstallExample: 'Native commands: npm install lodash, npm i lodash, pnpm add @scope/pkg',
477
515
  npmInstallExample2: 'Global CLI: npm install -g @scope/cli; or just type a package name like lodash',
478
516
  npmInstallInvalid: 'Enter an npm package name (e.g. lodash, @scope/pkg), or a native install command (e.g. npm install lodash, npm i lodash, pnpm add @scope/pkg, npm install -g @scope/cli)',
479
- gitInstallLabel: 'GitHub source',
480
- gitInstallPlaceholder: 'Repository address',
481
- gitInstallExample: 'e.g. owner/repo or https://github.com/owner/repo',
482
- gitInstallInvalid: 'Enter a GitHub repository address, e.g. owner/repo or https://github.com/owner/repo',
483
- dshCmdLabel: 'DeepSeek Harness command',
484
- dshCmdPlaceholder: 'Paste an official dsh plugin command',
485
- dshCmdInsertHubUpdate: 'Insert update command',
486
- dshCmdExample: 'e.g. dsh plugin --profile {profile} add github:owner/repo, or dsh plugin --profile {profile} update dsh-plugin',
487
- dshCmdInvalid: 'Paste an official dsh plugin command (--profile required, add / update), e.g. dsh plugin --profile {profile} update dsh-plugin',
488
517
  installHelp: 'Help',
489
518
  helpModalTitle: 'Supported command formats',
490
519
  npmInstallHelp: 'lodash or @scope/pkg\tjust type the package name\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli\tinstalls the CLI globally, not shown in Installed',
491
- gitInstallHelp: 'owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git',
492
- dshCmdHelp: 'dsh plugin --profile {profile} add <target>\tinstall\ndsh plugin --profile {profile} update <target>\tupdate an installed target to the latest version\ndsh plugin --profile={profile} add <target>\ndsh plugin --profile={profile} update <target>\n\t--profile is required (prefilled with the current profile here) and there is no -p shorthand; <target> can be an npm package or github:owner/repo; uninstall from the Installed list',
493
520
  globalNpmHint: 'This installs CLI tools globally (npm install -g). They won\'t appear in Installed and no host restart is needed.',
494
521
  installCliBtn: 'Install',
495
- // Install channel disabled (security-trust toggle off → card disabled, guides to settings)
522
+ // 安装通道关闭(安全信任开关关掉后,对应卡片禁用并引导去设置打开)
496
523
  channelDisabledHint: 'This install channel is disabled — enable it in Settings → Security & Trust',
497
524
  goToSettings: 'Go to Settings',
498
- // Custom install view: standalone top-level section, description text
499
- customViewDesc: 'Manually install an npm package, a GitHub source, or paste an official dsh plugin command. Finished installs appear in Installed, marked as custom.',
525
+ // 自定义安装视图:独立一级导航,说明文字
526
+ customViewDesc: 'Manually install an npm package outside the catalog. Finished installs appear in Installed, marked as custom.',
500
527
  customLabel: 'Custom install',
501
528
  installedSearch: 'Search installed plugins…',
502
529
  installedFilterCatalog: 'Catalog',
@@ -530,7 +557,7 @@ export const en = {
530
557
  detailCatalog: 'View details',
531
558
  packageName: 'Package',
532
559
  versionUpHint: 'v{from} → v{to} available — Update reinstalls in place',
533
- // Settings view: Updates & Sources / Security & Trust / Diagnostics / System Logs
560
+ // 设置视图:更新与通道 / 安全与信任 / 诊断 / 系统日志
534
561
  settingsUpdate: 'Update Settings',
535
562
  settingsUpdateDesc: 'Update checks and the network channels used for installs',
536
563
  settingsCheckOnStart: 'Check for updates on startup',
@@ -539,12 +566,11 @@ export const en = {
539
566
  settingsAutoInstallDesc: 'Install detected updates in the background without asking (a host restart applies them)',
540
567
  settingsProxy: 'HTTP proxy',
541
568
  settingsProxyDesc: 'Route npm, git and catalog requests through this proxy; leave empty to connect directly',
542
- // Live proxy reachability probe: reported after the user stops typing (an unreachable
543
- // address can still be saved — users may fill it in before actually starting the proxy)
569
+ // 代理连通性实时探测:输入停笔后提示检测结果(不通仍可保存,先填地址后开代理也合法)
544
570
  proxyCheckChecking: 'Testing this proxy address…',
545
571
  proxyCheckOk: 'Reachable — installs and catalog requests will route through it',
546
572
  proxyCheckFail: 'Unreachable, but you can still save it; make sure the proxy is running and the address and port are correct',
547
- // Failure reason: Windows Schannel aborts the handshake when revocation info (CRL/OCSP) is unreachable — not a bad proxy address
573
+ // 失败细分原因:Windows Schannel 必须取到证书吊销信息,取不到即中断握手 —— 不是代理地址不通
548
574
  proxyCheckRevocation: 'Certificate revocation check blocked (Windows Schannel could not fetch CRL/OCSP), so the handshake was aborted — a local TLS issue, not a bad proxy address',
549
575
  settingsMirror: 'npm mirror',
550
576
  settingsMirrorDesc: 'Unset by default — follows local npm config; pick a domestic mirror if slow',
@@ -554,13 +580,9 @@ export const en = {
554
580
  mirrorTencent: 'Tencent Cloud mirror',
555
581
  mirrorTsinghua: 'Tsinghua TUNA mirror',
556
582
  settingsSecurity: 'Security & Trust',
557
- settingsSecurityDesc: 'Toggles for the three command-line install channels: npm packages, GitHub sources and DSH commands',
583
+ settingsSecurityDesc: 'Toggles for command-line installs: npm packages',
558
584
  settingsEnableNpm: 'Enable npm installs',
559
585
  settingsEnableNpmDesc: 'Allow installing npm packages from the command line; turning this off rejects package-name installs',
560
- settingsEnableGit: 'Enable GitHub source installs',
561
- settingsEnableGitDesc: 'Allow installing from GitHub sources on the command line; turning this off rejects repository-address installs',
562
- settingsEnableDsh: 'Enable DSH command installs',
563
- settingsEnableDshDesc: 'Allow pasting a dsh plugin command to install; turning this off disables the command input',
564
586
  settingsDiagnostics: 'System Diagnostics',
565
587
  settingsDiagnosticsDesc: 'Check the connectivity of install channels: npm registry, GitHub and the catalog site',
566
588
  settingsLogs: 'System Logs',
@@ -571,7 +593,7 @@ export const en = {
571
593
  logsLoading: 'Reading log…',
572
594
  logsEmpty: 'No log entries yet',
573
595
  logsLoadFail: 'Failed to read the log; try again later',
574
- // Log-viewer dialog: a built-in window that loads the log in pages, filterable by type × level
596
+ // 日志查看器弹窗:内置窗口分页加载日志,可按类型 × 级别筛选
575
597
  logModalTitle: 'Log viewer',
576
598
  logViewerOpen: 'Open log viewer',
577
599
  logViewerDesc: 'View the local log in a built-in window; filter by type and level to pinpoint install / uninstall / update incompatibilities',
@@ -616,9 +638,9 @@ export const en = {
616
638
  logCount: '{n} entries',
617
639
  logEmptyFilter: 'No matching log entries',
618
640
  settingsDiagFail: 'Unreachable',
619
- // System diagnostics channel list: one-click full check + one row per channel, click to re-probe
641
+ // 系统诊断通道列表:一键全检 + 每通道一行,点击重测
620
642
  diagNpm: 'npm registry',
621
- // Diagnostics npm row: shown when no mirror is configured (probe still targets the official registry, the fallback)
643
+ // 诊断 npm 行:未配置镜像时显示的兜底文案(探测仍打官方源)
622
644
  diagNpmUnset: 'Unset (follow local npm config)',
623
645
  diagGithub: 'GitHub',
624
646
  diagCatalog: 'Catalog site',
@@ -633,20 +655,20 @@ export const en = {
633
655
  diagSummaryRunning: 'Checking channels…',
634
656
  diagSummaryOk: 'All channels reachable',
635
657
  diagSummaryFail: 'Unreachable channel(s) — click a row to re-check',
636
- // Failure reason: Windows Schannel aborts the handshake when revocation info (CRL/OCSP) is unreachable (easily mistaken for a network outage)
658
+ // 失败细分原因:Windows Schannel 取不到证书吊销信息即中断握手(易被误判为网络不通)
637
659
  diagFailRevocation: 'Cert check blocked',
638
660
  diagFailRevocationHint: 'The system curl cannot fetch certificate revocation info (CRL/OCSP, required by Windows Schannel), so the TLS handshake is aborted — this is not a network outage, and npm/git may still work. curl 7.70+ downgrades the check to best-effort, or switch to a network that can reach the revocation service.',
639
661
  settingsEnvSnapshot: 'System version',
640
662
  settingsEnvSnapshotDesc: 'Copy host version and system info for pasting into issue reports',
641
663
  settingsEnvCopy: 'Copy',
642
- // Restore defaults: first-level menu + its own settings card
664
+ // 恢复默认:一级菜单 + 独立设置卡片
643
665
  settingsReset: 'Restore Defaults',
644
666
  settingsResetDesc: 'Restore update policy, npm mirror, proxy and security restrictions to factory defaults in one go',
645
667
  settingsResetDetail: 'Reset update policy, npm mirror, proxy and security restrictions to factory defaults',
646
668
  settingsResetRun: 'Restore Defaults',
647
669
  settingsResetConfirm: 'Restore Defaults',
648
670
  settingsResetConfirmDetail: 'Reset all settings to factory defaults? Update policy, npm mirror, proxy and security restrictions will be cleared.',
649
- // Update notice (notification center item title)
671
+ // 更新提醒(通知中心条目标题)
650
672
  updateNoticeTitle: 'Update available',
651
673
  updateNoticeGo: 'Update',
652
674
  ignoreUpdateRun: 'Ignore this update',
@@ -674,11 +696,11 @@ export const en = {
674
696
  installNow: 'Install',
675
697
  installing: 'Installing…',
676
698
  installDone: 'Installed',
677
- // Updated (notification center distinguishes install/update): update = in-place reinstall to latest
699
+ // 已更新(通知中心区分安装/更新):更新 = 原位覆盖重装到最新版
678
700
  updateDone: 'Updated',
679
701
  installResultTitle: 'Plugin installed successfully',
680
702
  installResultDesc: '',
681
- // Update semantics: the "update" action re-runs add in place — copy differentiates install vs update
703
+ // 更新语义:更新动作原位重跑 add —— 文案区分安装与更新
682
704
  confirmUpdateTitle: 'Confirm update',
683
705
  updateNow: 'Update',
684
706
  updating: 'Updating…',
@@ -689,15 +711,14 @@ export const en = {
689
711
  requestTimeout: 'Request timed out: GitHub may be unreachable or the network is unstable — try again later',
690
712
  confirmCancel: 'Cancel',
691
713
  doneBtn: 'Done',
692
- // Result-view fallback: the single "Restart now" only appears when a refresh cannot help
693
- // (hot-mount failure / non-dsh plugin / update); closing the modal means "later"
714
+ // 结果视图兜底:仅刷新解决不了时(热挂载失败 / 非 dsh 插件 / 更新)才给单个「立即重启」;
715
+ // 关闭弹窗即视为「稍后」
694
716
  restartNow: 'Restart now',
695
717
  restarting: 'Restarting…',
696
718
  restartHint: 'Restarting interrupts any in-progress install / uninstall task — its progress will be lost. Some plugins (such as plugin markets / top-level bundles) only take effect after a restart.',
697
- // Desktop: the app shell owns the host, so plugins cannot restart it — tell the user to quit and reopen
719
+ // 桌面端:宿主由应用壳托管,插件重启不了它 —— 提示用户退出后重开
698
720
  toastRestartDesktop: 'In the desktop app the host is managed by the app: quit from the app menu (or tray) and open it again — the change takes effect after that restart',
699
- // Applied without a restart: the install was hot-mounted into the running loader;
700
- // the page auto-refreshes on close (no manual refresh button)
721
+ // 免重启即生效:安装已热挂载进运行中 loader;关闭弹窗时页面自动刷新(不给手动刷新按钮)
701
722
  reloadHint: 'The plugin is loaded — closing this window will refresh the page automatically.',
702
723
  toastInstalledLive: 'Installed — active now',
703
724
  toastInstalledReload: 'Installed — refreshing the page automatically…',
@@ -726,9 +747,9 @@ export const en = {
726
747
  errorTitle: 'Operation failed',
727
748
  errorTitleInstall: 'Install failed',
728
749
  errorTitleUninstall: 'Removal failed',
729
- // Update failed (notification center distinguishes install/update): update target reinstall failed
750
+ // 更新失败(通知中心区分安装/更新):更新目标覆盖重装失败
730
751
  errorTitleUpdate: 'Update failed',
731
- // Action words: failure hints and filed reports take their wording from here
752
+ // 动作词:失败提示与上报正文的措辞都取自这里
732
753
  actionInstall: 'install',
733
754
  actionUpdate: 'update',
734
755
  actionUninstall: 'removal',
@@ -739,41 +760,40 @@ export const en = {
739
760
  failCopy: 'Copy full log',
740
761
  failIssueHint: 'Open a pre-filled issue on the author repo with this error log (includes catalog links)',
741
762
  failIssueBig: 'Report this bug to GitHub — contribute to open source',
742
- // Non-plugin-side failures (unclassified / pnpm allowBuilds block) now route to the hub repo for triage
763
+ // 非插件侧失败(未分类)改为投递到插件中心仓库分诊
743
764
  failHubIssueHint: 'This failure was classified as an environment or Plugin Hub issue (not a plugin-author issue). Open a pre-filled issue on the Plugin Hub repo with this error log.',
744
765
  failHubIssueBig: 'Report to the Plugin Hub for triage',
745
- // Unknown-failure fallback: not routed to the plugin author, but to the hub repo for triage
766
+ // 未知失败兜底:不投插件作者,改投插件中心仓库分诊
746
767
  failUnclassifiedHint: 'The {action} failed and the cause could not be identified automatically. This is usually not the plugin itself (it may relate to your local environment or the Plugin Hub). Please report the error to the Plugin Hub so the maintainers can triage it.',
747
- // The hub's own state-guard messages (plugin not installed / cannot be uninstalled here / already queued / already installed): the installed list is out of sync with the live snapshot — not a plugin issue, no issue prompt
768
+ // 插件中心自身的状态守卫消息(未安装 / 不在此处卸载 / 已在队列中 / 已安装):已装列表与实读快照不同步 —— 不是插件问题,不引导提 Issue
748
769
  failHubStateHint: 'The plugin list is out of date or out of sync: the target of this {action} may already be in the list (use "Update" to upgrade), may no longer be in the installed list, or may already be queued. This is not a plugin problem — refresh the page and retry.',
749
- // The command hit the local time limit and was killed: it may well have taken effect already (the installer re-checks the installed list after a timeout) — actionable hint, no issue prompt
770
+ // 命令跑满本机时限被强杀:可能其实已生效(安装器超时后会复核已装列表)—— 给可行动提示,不引导提 Issue
750
771
  failTimeoutHint: 'This operation exceeded the local time limit and was interrupted — but it may well have taken effect already (the installer re-checks the installed list after a timeout). Refresh the page to confirm the current state; if it did not take effect, run the corresponding command in a terminal to see the full output. This is not a plugin problem.',
751
772
  failProfileLockHint: 'DSH timed out waiting for the file lock while writing the plugin list — usually because another DSH process or install task is writing the same profile (sometimes a previous run left the lock behind). Close other dsh windows or running commands, then retry; if it keeps happening, restart DSH once. This is not a plugin problem, and there is no need to repeat the {action}.',
752
- // The host could not launch itself to run the operation: not a plugin issue — hint only, no issue prompt
773
+ // 宿主自身入口起不来:不是插件问题 —— 只给提示,不引导提 Issue
753
774
  failHostCliSpawnHint: 'DSH could not start itself to perform this operation (the system reported that the executable was not found). This usually means the DSH installation folder has been moved or is being updated, or that the profile directory does not exist yet. Restart DSH and retry; if it keeps happening, reinstall DSH. This is not a plugin problem — other plugins would fail the same way.',
754
- // prepare script actually failed (git tarball misses submodules/build output): a packaging issue of the plugin itself — file an issue
755
- failPrepareHint: 'This plugin failed while running its build scripts during install (git tarballs often miss submodules or build output). This is a packaging issue of the plugin itself — please report it to the author repository.',
756
- // Secondary entry on the "plugin packaging" branch: that verdict comes from the hub's own
757
- // pre/post-install check, not from pnpm output — a false positive sends users to the author
758
- // repo and the hub never hears about it, so keep a feedback path here.
775
+ // prepare 构建脚本实际执行失败:插件自身打包分发问题 —— 引导提 Issue
776
+ failPrepareHint: 'This plugin failed while running its build scripts during install (the published npm package is incomplete). This is a packaging issue of the plugin itself — please report it to the author repository.',
777
+ // 「插件打包问题」分支的次要入口:该判定来自插件中心自己的装前/装后校验,不是 pnpm 原文 ——
778
+ // 一旦误报,用户会被送去作者仓库、我们永远收不到反馈,故在此保留一条反馈通道。
759
779
  failMisjudgeHint: 'If this plugin actually installs fine (the verdict above is the Plugin Hub misjudging it), please report it to the Hub: that verdict is produced by the marketplace itself, so a false positive can only be found through your feedback.',
760
780
  failMisjudgeLink: 'Plugin installs fine but got blocked? Report to the Plugin Hub',
761
- // Pre-install / post-install guard hit ([packaging]): git distribution lacks a file the package needs (entry / entry a patch mounts / bundle patch) = not adapted to the official default install method
781
+ // 装前/装后校验命中([packaging]):git 分发缺包所需的文件(入口 / 补丁按包名 mount 的入口 / bundle 补丁)= 未适配官方默认安装方式
762
782
  failPackagingHint: 'This plugin does not support the official default install method: its git distribution lacks a file the package needs (the entry from `main` / `exports`, an entry its own patch mounts by name, or the patch declared by `dsh.bundle.patch`), so it has not been adapted to the official install flow. Please file an Issue on the author\'s repo asking for committed build output, a prebuilt release `.tgz` (`releases/download/<tag>/<asset>.tgz`), or a complete npm release.',
763
- // native-module build scripts ignored by pnpm by default (e.g. node-pty, ERR_PNPM_IGNORED_BUILDS): not a plugin-side issue on its own, route to the hub repo for triage
764
- failIgnoredBuild: 'This plugin (or one of its dependencies) needs to run build scripts at install time, which pnpm blocks by default via its allowBuilds allowlist — so this operation fails (e.g. native modules like node-pty, or the plugin\'s own prepare script on git installs). The installer already auto-allows that key and retries once; if it still fails, the build itself is usually the problem. Run the install command in a terminal to see the full build error; if it is indeed the plugin\'s build or distribution, the author can ship prebuilt output, an npm release, or a prebuilt .tgz. You can also report it to the Plugin Hub for triage.',
783
+ // pnpm 默认忽略的原生模块构建脚本(如 node-pty,ERR_PNPM_IGNORED_BUILDS):插件的依赖需在用户机器上编译原生模块,
784
+ // 自动放行 allowBuilds 重试一次仍失败即任何用户都装不上 —— 属作者侧,引导到作者仓库提 Issue
785
+ failIgnoredBuild: 'This plugin (or one of its dependencies) needs to run build scripts at install time, which pnpm blocks by default via its allowBuilds allowlist — so this operation fails (e.g. native modules like node-pty, or the plugin\'s own prepare script on git installs). The installer already auto-allows that key and retries once; if it still fails, the build itself is the problem, so no user can install it. Run the install command in a terminal to see the full build error; this is a build/distribution issue of the plugin itself — please report it to the author repository, asking them to ship prebuilt output, a complete npm release, or a prebuilt .tgz.',
765
786
  failNpmTooLow: 'Your local npm may be too old: npm crashed internally while resolving the plugin\'s dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest',
766
787
  failNpmTooLowV: 'Your local npm is too old (v{v}): npm crashed internally while resolving the plugin\'s dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest',
767
- // Pre-install connectivity probe / connection failure in the install log ([network] / git fetch timeout / DNS / TLS): a local network or proxy issue, not a plugin issue — no issue link
788
+ // 安装前网络探测 / 安装日志里的连接失败([network] / git fetch 超时 / DNS / TLS):本机网络或代理问题,不是插件问题 —— 不引导提 Issue
768
789
  failNetworkHint: 'The network could not be reached before the {action}: the install source is unreachable (offline, DNS failure, firewall block, or a misconfigured proxy). This is not a problem with the plugin itself — please check your connection, confirm the HTTP proxy in Settings, run a connectivity check under System Diagnostics, then retry.',
769
- // Prominent "cannot reach …" line in the network-failure dialog: shows the exact unreachable address ({url})
790
+ // 网络失败弹窗里的「无法访问 …」醒目行:显示具体的不可达地址({url})
770
791
  failNetworkRegistryHint: 'Your npm/pnpm registry is set to {host}, and the package tarball could not be downloaded from it. This usually means a private/internal mirror that has not synced the package (or requires intranet auth) — point the registry back to https://registry.npmjs.org (or make sure this source can serve the package), then retry.',
771
792
  failNetworkTarget: 'Cannot reach {url} — your network connection is down',
772
- // Diagnostics shortcut button under the network-down hint: jumps to Settings → System Diagnostics
793
+ // 网络不通提示下的诊断快捷按钮:跳到设置 → 系统诊断
773
794
  failNetworkRunDiag: 'Run a network diagnostic',
774
- // The request origin did not pass the local hub service check (403 untrusted origin): the request
775
- // never reached the install flow — nothing to do with the plugin, so point at the local address
776
- // and do not offer an issue link
795
+ // 请求来源没通过本地 hub 服务校验(403 untrusted origin):请求根本没进安装流程 ——
796
+ // 与插件无关,故引导从本机地址重开,不引导提 Issue。
777
797
  failOriginRejectedHint: 'This install request did not pass the marketplace origin check and was rejected by the local service, so the install never started — this is not about the plugin itself. It usually means the marketplace page was not opened from a local address (for example a LAN IP), or the host page origin was not recognized. Reopen the marketplace from localhost and retry; on the desktop app, restart the host once. If it still fails after restarting the host, your dsh-plugin version is incompatible with the host — upgrade the marketplace with dsh plugin --profile {profile} add dsh-plugin@latest, then restart the host again.',
778
798
  failDshMissingHint: 'The dsh command could not be found (it is not on the system PATH), so the installer could not run. Please make sure DeepSeek Harness is installed correctly and dsh is on your PATH (or reinstall it), then retry. This is not a problem with the plugin itself.',
779
799
  failGitMissingHint: 'The git command could not be found (Git is not installed or not on the system PATH), so GitHub-source plugins cannot be installed. Please install Git (e.g. from git-scm.com/downloads) or add git to your PATH, restart DSH, then retry. This is not a problem with the plugin itself.',
@@ -781,13 +801,68 @@ export const en = {
781
801
  failNpmMissingHint: 'The npm command could not be found (npm is not installed or not on the system PATH), so a global install cannot run. Please install Node.js (which bundles npm), make sure npm is on your PATH, then retry. This is not a problem with the plugin itself.',
782
802
  failPnpmStoreHint: 'pnpm reported an unexpected store location (ERR_PNPM_UNEXPECTED_STORE): the profile directory was previously set up with a different major version of pnpm, and the current pnpm refuses to reuse it — no plugin can be installed into that profile. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles/<profile>/hub.log for the full output), then reinstall. This is not a problem with the plugin itself.',
783
803
  failPnpmUnusedPatchHint: 'pnpm reported that some patches were not used (ERR_PNPM_UNUSED_PATCH): your profile still holds a patch entry for an older dsh-plugin version (for example dsh-plugin@1.4.2), while this install resolved a different version, so pnpm aborts the whole install for safety — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dsh-plugin patch entry from pnpm-workspace.yaml (pnpm 11+) or from pnpm.patchedDependencies in package.json (pnpm 10) inside the profile directory (~/.dsh/profiles/<profile>), then retry.',
784
- // Missing dependency: name the package that 404'd (the line is skipped when it cannot be parsed),
785
- // then give the removal instructions
804
+ // 缺失依赖:点名 404 的包(解析不出时跳过该行),再给删除指引
786
805
  failPnpmMissingDepTarget: '{pkg} was not found on the npm registry (404)',
787
806
  failPnpmMissingDepHint: 'pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): your profile keeps a dependency on a package that was never published, and pnpm hits it every time it resolves dependencies — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — then retry.',
788
807
  failRegistryMirrorLagHint: 'pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): that package does exist on the official npm registry, but the npm/pnpm registry (or mirror) configured on your machine has not synced it. Point the npm/pnpm registry back at the official one (https://registry.npmjs.org), or switch to a mirror that has the package, then retry. This is not a problem with the plugin itself.',
789
808
  failPluginMissingDepTarget: '{pkg} does not exist on the official npm registry',
790
809
  failPluginMissingDepHint: 'A package this plugin depends on does not exist on the official npm registry (removed, or never published). This is a dependency problem on the plugin author side, not a problem with your environment. Please report it to the plugin repository so the author can fix that dependency or ship it together with the plugin.',
810
+ failHostIncompatibleKind: 'Plugin does not support the DSH version in use',
811
+ failHostIncompatibleReason: 'The current DSH ({version}) is not in this plugin\'s compatibility list, so the host refused before installing anything.',
812
+ failHostIncompatibleHint: '① Ask the author to extend the supported dsh versions and publish a release (button below).\n② Grant an exact-version exemption in the plugin manager of the desktop app (the host warns about crash / data-loss risk).',
813
+ // Unified failure card header: kind label + one-line reason (per-kind details stay in fail*Hint)
814
+ failKind_npmTooOld: 'npm on this machine is too old',
815
+ failReason_npmTooOld: 'The installed npm cannot resolve the dependency tree of this package, so it aborted.',
816
+ failKind_dshMissing: 'dsh is not installed on this machine',
817
+ failReason_dshMissing: 'The installer needs to call dsh, but it cannot be found on your machine.',
818
+ failKind_gitMissing: 'git is not installed on this machine',
819
+ failReason_gitMissing: 'A dependency of this package needs git, but git cannot be found.',
820
+ failKind_pnpmMissing: 'pnpm is not installed on this machine',
821
+ failReason_pnpmMissing: 'The installer uses pnpm to add plugins, but pnpm cannot be found.',
822
+ failKind_npmMissing: 'npm is not installed on this machine',
823
+ failReason_npmMissing: 'The install flow needs npm, but it cannot be found.',
824
+ failKind_pnpmStore: 'pnpm store version mismatch',
825
+ failReason_pnpmStore: 'The profile dependencies were written by a different pnpm major, which the current pnpm does not accept.',
826
+ failKind_pnpmWorkspace: 'workspace-root check blocked the install',
827
+ failReason_pnpmWorkspace: 'The profile is treated as a workspace root without a root operation declared, so pnpm aborted.',
828
+ failKind_originRejected: 'request origin rejected by the local service',
829
+ failReason_originRejected: 'The request never reached the install flow: the local service rejected its origin.',
830
+ failKind_pnpmPolicy: 'blocked by the pnpm supply-chain policy',
831
+ failReason_pnpmPolicy: 'The version is younger than the minimum release age, or an integrity / trust check failed.',
832
+ failKind_pnpmUnusedPatch: 'stale patch entry in the profile',
833
+ failReason_pnpmUnusedPatch: 'The profile keeps a patch for an older dsh-plugin version, so pnpm aborted for safety.',
834
+ failKind_pnpmMissingDep: 'a dependency does not exist on the registry',
835
+ failReason_pnpmMissingDep: 'The profile keeps a dependency on an unpublished package, which pnpm hits on every resolve.',
836
+ failKind_pluginMissingDep: 'plugin dependency is not published',
837
+ failReason_pluginMissingDep: 'A package the plugin depends on does not exist on the official npm registry.',
838
+ failKind_registryVersionStale: 'this version is not available on the registry in use',
839
+ failReason_registryVersionStale: 'The registry that actually performs the install has not synced this version yet, or the version is mistyped.',
840
+ failKind_pnpmLinkedDirMissing: 'dangling local dependency in the profile',
841
+ failReason_pnpmLinkedDirMissing: 'A link/file dependency points at a directory that no longer exists, so pnpm stalls on it.',
842
+ failKind_fileLocked: 'a file is held by another program',
843
+ failReason_fileLocked: 'pnpm could not replace a file inside the profile because another program is holding it.',
844
+ failKind_accessDenied: 'write access denied',
845
+ failReason_accessDenied: 'The system denied pnpm write access to files inside the profile.',
846
+ failKind_fsUnavailable: 'the disk is not writable',
847
+ failReason_fsUnavailable: 'The disk is full or read-only, or file handles are exhausted.',
848
+ failKind_pnpmIgnoredBuild: 'native build scripts blocked',
849
+ failReason_pnpmIgnoredBuild: 'A plugin dependency has to be compiled on your machine, and pnpm blocks build scripts by default.',
850
+ failKind_pluginPrepare: 'plugin distribution is incomplete',
851
+ failReason_pluginPrepare: 'The published package is missing files, or its build script failed.',
852
+ failKind_hostIncompatible: 'plugin does not support the DSH version in use ({version})',
853
+ failReason_hostIncompatible: 'The plugin\'s declared compatibility list does not include the DSH version you are running.',
854
+ failKind_network: 'network connection failed',
855
+ failReason_network: 'The install could not reach the npm registry or the proxy, so the request never completed.',
856
+ failKind_hostCliSpawn: 'the DSH host could not be launched',
857
+ failReason_hostCliSpawn: 'The resolved host entry point would not start, so the install command never ran.',
858
+ failKind_hubState: 'plugin hub state is out of sync',
859
+ failReason_hubState: 'The locally recorded install state does not match reality, so this operation had no effect.',
860
+ failKind_timeout: 'operation timed out',
861
+ failReason_timeout: 'The install exceeded the time limit and was aborted.',
862
+ failKind_profileLock: 'profile is locked by another process',
863
+ failReason_profileLock: 'Another dsh process is using this profile right now.',
864
+ failKind_hub: 'unknown error',
865
+ failReason_hub: 'We could not identify this error yet — you can report it to us in one click.',
791
866
  failRegistryVersionStaleHint: 'pnpm reported that no matching version was found (ERR_PNPM_NO_MATCHING_VERSION): the version being installed does not exist in the npm registry that actually performs the install. This usually means the npmRegistry configured in the hub differs from the source in your local ~/.npmrc — the official registry has published it but the mirror has not synced yet (it can take minutes to hours) — or the version number was simply mistyped. This is not a problem with the plugin itself. Align the hub\'s npmRegistry with your local ~/.npmrc (or the other way round), or explicitly use the official registry (https://registry.npmjs.org) for that one install, or use an offline package, then retry; if the version was published only recently, waiting for the mirror to sync is enough.',
792
867
  failPnpmLinkedDirMissingHint: 'pnpm reported that a directory it needs to install from does not exist (ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND): your profile keeps a local dependency (a link: / file: entry, e.g. from `dsh plugin add <local path>`) whose target directory has since been deleted or moved. pnpm hits it every time it resolves profile dependencies, so no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that local dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — or restore the directory to its original path, then retry.',
793
868
  failFileLockedHint: 'During install, pnpm could not replace a file inside the profile because another program is holding it (on Windows this shows as os error 32, "the process cannot access the file because it is being used by another process"). Usually DeepSeek Harness itself or a real-time antivirus scan holds the handle. This is not a problem with the plugin itself — fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry.',
@@ -796,14 +871,12 @@ export const en = {
796
871
  failPnpmWorkspaceHint: 'pnpm refused to add the dependency to the workspace root (ERR_PNPM_ADDING_TO_ROOT): the profile directory is treated as a pnpm workspace root, and this install command did not declare that it operates at the root, so pnpm rejected it outright — no plugin can be installed into that profile. This is not a problem with the plugin itself. Add `ignore-workspace-root-check=true` to the `.npmrc` inside the profile directory (~/.dsh/profiles/<profile>) and retry, or upgrade DeepSeek Harness and try again.',
797
872
  failPnpmTarballIntegrityHint: 'pnpm reported ERR_PNPM_MISSING_TARBALL_INTEGRITY: a tarball entry in the lockfile has no checksum to verify the downloaded package. Read the full log, fully quit DeepSeek Harness, and inspect and back up package.json, pnpm-lock.yaml and pnpm-workspace.yaml in the affected profile. Once the dependency sources are verified, rename pnpm-lock.yaml to preserve it, then use the same DSH installer to install a plugin version compatible with the host and regenerate the lockfile. This resolves profile dependencies again: compare the old and new versions, and keep integrity checks enabled.',
798
873
  failPnpmPolicyHint: 'The installer was blocked by pnpm supply-chain security policy — every plugin install would hit the same wall, so this is not a problem with the plugin itself. Two cases: ① "Minimum release age" (ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION): the package was published less than 24 hours ago, and pnpm 11 refuses freshly-published packages for safety. Add minimumReleaseAge: 0 to your pnpm config (pnpm-workspace.yaml) to opt out, or wait until the 24 hours have passed and retry. ② "untrusted origin" (ERR_PNPM_UNTRUSTED_ORIGIN): a dependency source is not trusted by this machine, usually because plugins were previously installed via github: or a non-official npm registry, so the lockfile records an untrusted source. Delete node_modules and pnpm-lock.yaml under the profile directory (see System Logs or ~/.dsh/profiles/<profile>/hub.log for the full output), then reinstall.',
799
- // minimumReleaseAge only: compute the exact retry time ({time}) from the error so the user knows
800
- // when installs will work again, instead of the vague "wait 24 hours"
874
+ // 仅 minimumReleaseAge 场景:从报错算出确切的可重试时刻({time}),让用户知道何时能装,
875
+ // 而不是笼统的「等 24 小时」
801
876
  failPnpmReleaseAgeHint: 'The installer was blocked by pnpm supply-chain security policy, and every plugin installed into this profile would hit the same wall — this is not a problem with the plugin itself. The package was published less than 24 hours ago, and pnpm 11 refuses freshly-published packages for safety, so both installs and removals are blocked for this profile in the meantime. Retry after: {time} (i.e. 24 hours after the package was published). If you must install right now, add minimumReleaseAge: 0 to pnpm-workspace.yaml inside the profile directory (~/.dsh/profiles/<profile>) to opt out, but that loosens supply-chain protection for the whole profile.',
802
- // Custom install entry channel names (the three cards) — used in error/log traceability
877
+ // 自定义安装入口渠道名 —— 用于报错/日志溯源
803
878
  installChannelNpm: 'NPM package',
804
- installChannelGit: 'GitHub source',
805
- installChannelDsh: 'DSH command',
806
- // Entry traceability line prefixed at the top of the error text: which card initiated this install
879
+ // 错误正文顶部的入口溯源行:指出从哪张卡片发起本次安装
807
880
  installEntryLine: 'Install entry: {c}.',
808
881
  reportIssue: 'Report an Issue to the plugin repo',
809
882
  detail: 'Open details',
@@ -814,12 +887,12 @@ export const en = {
814
887
  monthsAgo: 'updated {months}mo ago',
815
888
  yearsAgo: 'updated {years}y ago',
816
889
  pluginsTotal: 'Results: {n} plugins',
817
- // Category chips carry no counts; the filtered result count shows in the list header
890
+ // 分类 chip 不带计数;筛选结果数显示在列表头部
818
891
  filterResults: 'Results: {n} plugins',
819
892
  more: '{n} more on the website',
820
893
  browseAll: 'Browse all {n} plugins',
821
894
  verified: 'Verified',
822
- // Version & updates: repos with a release are compared by tag; repos without one by last push time (new commits → update)
895
+ // 版本与更新:有 release 的仓库比 tag,没有的比最近推送时间(有新提交即有更新)
823
896
  version: 'Version',
824
897
  update: 'Update',
825
898
  updateAvailable: 'Update available',
@@ -833,10 +906,10 @@ export const en = {
833
906
  versionHint: 'View version info and changelog',
834
907
  hubCurrentTitle: 'Current version',
835
908
  hubCurrentDesc: 'You are on v{version} — this is the latest version.',
836
- // Deferred notice: a newer release exists but is still inside pnpm's 24h supply-chain window
909
+ // 暂缓提示:确有新版本,但仍在 pnpm 24h 供应链门禁窗口内
837
910
  hubPendingDesc: 'v{version} has been released, but it is still within the 24-hour window where pnpm silently falls back to the older version, so the update is not offered yet. The update entry will appear here shortly.',
838
911
  hubUpToDate: 'Up to date',
839
- // Header "Follow us" modal: platform intro + user feedback group QR (content pushed via Worker /about Markdown)
912
+ // 头部「关注我们」弹窗:平台介绍 + 用户反馈群二维码(内容由 Worker /about 以 Markdown 推送)
840
913
  followUs: 'Follow us',
841
914
  aboutTitle: 'Follow us',
842
915
  aboutDesc: 'Learn what DSH Plugin Hub does and join our user feedback group.',