dsh-config-manager 0.1.84 → 0.1.85

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 (80) hide show
  1. package/lib/client.d.ts +153 -399
  2. package/lib/client.js +1522 -2225
  3. package/lib/core/messages.d.ts +1 -0
  4. package/lib/core/messages.js +2 -0
  5. package/lib/index.d.ts +4 -2
  6. package/lib/index.js +5 -5
  7. package/lib/routes/sync.js +92 -70
  8. package/lib/sync/git/git-transport.d.ts +2 -0
  9. package/lib/sync/git/git-transport.js +75 -22
  10. package/lib/sync/messages.d.ts +2 -0
  11. package/lib/sync/messages.js +4 -0
  12. package/lib/sync/sync-engine.d.ts +4 -4
  13. package/lib/sync/sync-engine.js +3 -4
  14. package/lib/ui/i18n.d.ts +2 -84
  15. package/lib/ui/i18n.js +4 -168
  16. package/package.json +1 -1
  17. package/src/client/ConfigManagerSection.tsx +1 -18
  18. package/src/client/about/AboutPanel.tsx +4 -11
  19. package/src/client/about/ReleaseNotesDialog.tsx +1 -2
  20. package/src/client/chat/chat-locales.ts +0 -8
  21. package/src/client/common/CommandPalette.tsx +0 -1
  22. package/src/client/common/ContentPicker.tsx +10 -1
  23. package/src/client/common/info-hint-guard.test.ts +4 -4
  24. package/src/client/config-manager.module.css +2 -32
  25. package/src/client/environment/EnvironmentPanel.tsx +10 -9
  26. package/src/client/environment/maintenance/DiskUsageCard.tsx +10 -10
  27. package/src/client/export/ExportView.tsx +10 -13
  28. package/src/client/history/HistoryPanel.tsx +9 -11
  29. package/src/client/history/history-locales.ts +4 -40
  30. package/src/client/home/BackupScheduleCard.tsx +0 -2
  31. package/src/client/home/HomePanel.tsx +75 -49
  32. package/src/client/import/ForeignImportView.tsx +6 -7
  33. package/src/client/import/ImportWizardView.tsx +8 -9
  34. package/src/client/import/import-wizard-steps.tsx +20 -15
  35. package/src/client/library/BackupInspectView.tsx +3 -11
  36. package/src/client/library/LibraryActions.tsx +2 -1
  37. package/src/client/library/LibraryPanel.tsx +6 -3
  38. package/src/client/locales.ts +122 -278
  39. package/src/client/market/MarketImportReview.tsx +6 -5
  40. package/src/client/market/MarketPanel.tsx +2 -2
  41. package/src/client/market/MyConfigsLoginCard.tsx +0 -3
  42. package/src/client/market/MyConfigsView.tsx +3 -4
  43. package/src/client/market/MyConfigsWizard.tsx +8 -4
  44. package/src/client/market/market-locales.ts +20 -60
  45. package/src/client/recovery/IncompleteCopiesSection.tsx +6 -8
  46. package/src/client/recovery/RecoveryPanel.tsx +48 -73
  47. package/src/client/recovery/RollbackCard.tsx +27 -20
  48. package/src/client/recovery/recovery-locales.test.ts +1 -3
  49. package/src/client/recovery/recovery-locales.ts +71 -133
  50. package/src/client/recovery/recovery-panel-layout.test.ts +4 -2
  51. package/src/client/sync/DecryptPasswordCard.tsx +2 -2
  52. package/src/client/sync/MergeModal.tsx +3 -1
  53. package/src/client/sync/MergePreviewView.tsx +14 -16
  54. package/src/client/sync/PushPreviewCard.tsx +0 -1
  55. package/src/client/sync/SecurityOptionsCard.tsx +5 -1
  56. package/src/client/sync/SyncChannelEntryCard.tsx +3 -10
  57. package/src/client/sync/SyncConfirmView.tsx +23 -20
  58. package/src/client/sync/SyncLogList.tsx +5 -2
  59. package/src/client/sync/SyncPanel.tsx +10 -9
  60. package/src/client/sync/SyncProbeRow.tsx +6 -8
  61. package/src/client/sync/SyncSectionPickerDialog.tsx +3 -3
  62. package/src/client/sync/WorkDirCard.tsx +6 -7
  63. package/src/client/sync/preview-failure.test.ts +58 -0
  64. package/src/client/sync/preview-failure.ts +47 -0
  65. package/src/client/sync/sync-api.ts +19 -3
  66. package/src/client/sync/sync-entry.test.ts +6 -0
  67. package/src/client/sync/sync-entry.ts +4 -1
  68. package/src/client/sync/sync-locales.ts +31 -147
  69. package/src/client/sync/sync-push-preview.test.ts +1 -1
  70. package/src/client/sync/sync-view.ts +1 -4
  71. package/src/core/messages.ts +2 -0
  72. package/src/index.ts +6 -6
  73. package/src/routes/sync.ts +91 -69
  74. package/src/sync/git/git-clone-auth.test.ts +61 -0
  75. package/src/sync/git/git-transport.test.ts +75 -1
  76. package/src/sync/git/git-transport.ts +74 -20
  77. package/src/sync/messages.ts +4 -0
  78. package/src/sync/sync-engine.ts +6 -6
  79. package/src/sync/sync-preview-empty.test.ts +58 -0
  80. package/src/ui/i18n.ts +4 -168
package/lib/ui/i18n.d.ts CHANGED
@@ -13,13 +13,8 @@ export declare const uiZh: {
13
13
  readonly commonClose: '关闭';
14
14
  readonly commonCancel: '取消';
15
15
  readonly commonRetry: '重试';
16
- readonly commonLoading: '加载中…';
17
16
  readonly commonUnknownError: '未知错误';
18
- readonly commonNext: '下一步';
19
- readonly commonBack: '上一步';
20
- readonly commonDone: '完成';
21
17
  readonly 'export.download': '下载备份文件';
22
- readonly 'export.running': '正在导出…';
23
18
  readonly 'export.run': '开始导出';
24
19
  readonly 'export.selectionWarnings': '以下分区为设备相关数据,跨设备导入时可能不适用:';
25
20
  readonly 'export.included': '已包含';
@@ -55,7 +50,6 @@ export declare const uiZh: {
55
50
  readonly 'report.fullText': '完整文本报告(含逐项原因)';
56
51
  readonly 'report.secrets': '密钥:';
57
52
  readonly 'report.credentialsNeedEntry': '{count} 个凭据需要补录';
58
- readonly 'report.restartRequired': '重启 DSH 后生效:{detail}';
59
53
  readonly 'report.restartPluginsMcp': '插件/MCP 更改将在重启 DSH 后生效';
60
54
  readonly 'report.rollbackFull': '回滚:已完整恢复导入前的配置。';
61
55
  readonly 'report.rollbackPartial': '回滚部分完成。';
@@ -68,7 +62,6 @@ export declare const uiZh: {
68
62
  readonly 'report.badgeRedacted': '{count} 项已脱敏';
69
63
  readonly 'report.rollback': '回滚';
70
64
  readonly 'report.action.fixIssues': '查看失败项';
71
- readonly 'report.action.viewDetails': '查看详情';
72
65
  readonly 'report.includedSections': '已包含的分区';
73
66
  readonly 'report.excludedSections': '未包含的分区';
74
67
  readonly 'report.warnings': '注意事项';
@@ -84,7 +77,6 @@ export declare const uiZh: {
84
77
  readonly 'report.unit.workspaces': '个工作区';
85
78
  readonly 'report.unit.credentials': '项凭据状态';
86
79
  readonly 'report.unit.notes': '条说明';
87
- readonly 'report.action.done': '完成';
88
80
  readonly 'error.notMounted': 'config-manager 服务未挂载(插件未加载):请确认 profile 中已安装 dsh-config-manager 并重启 DSH';
89
81
  readonly 'error.apiPathMissed': '接口路径未命中(HTTP {status}):请求前缀为 {base},但该路径没有返回 JSON —— 若你经反向代理挂在子路径下,请检查代理是否转发了这个前缀(issue #108)';
90
82
  readonly 'error.httpInvalidJson': 'HTTP {status}: 无效的 JSON 响应';
@@ -134,15 +126,7 @@ export declare const uiZh: {
134
126
  readonly 'progress.recovering': '正在恢复/回滚…';
135
127
  readonly 'progress.done': '已完成';
136
128
  readonly 'progress.failed': '已失败';
137
- readonly 'snapshots.createdAt': '创建时间';
138
- readonly 'snapshots.sourceZip': '来源';
139
129
  readonly 'snapshots.status': '状态';
140
- readonly 'snapshots.entries': '条目';
141
- readonly 'snapshots.plugins': '插件';
142
- readonly 'snapshots.statusPending': '待处理';
143
- readonly 'snapshots.statusDone': '已完成';
144
- readonly 'snapshots.statusRolledback': '已回滚';
145
- readonly 'snapshots.statusUnknown': '未知';
146
130
  readonly 'snapshots.planTitle': '恢复计划预览';
147
131
  readonly 'snapshots.confirmRestore': '确认恢复?会先把当前文件备份到一个安全位置,再删除导入期间新增的插件。';
148
132
  readonly 'snapshots.execute': '执行恢复';
@@ -153,8 +137,6 @@ export declare const uiZh: {
153
137
  readonly 'snapshots.failed': '失败';
154
138
  readonly 'snapshots.skipped': '跳过';
155
139
  readonly 'snapshots.noActions': '该快照无可恢复动作(或全部跳过)。';
156
- readonly 'snapshots.empty': '暂无快照。导入时会自动创建安全快照。';
157
- readonly 'snapshots.loading': '正在加载快照…';
158
140
  readonly 'snapshots.selectHint': '选择一个快照预览其恢复计划(只读预览,不会改动任何设置):';
159
141
  readonly 'snapshots.reportTitle': '恢复报告';
160
142
  readonly 'sync.privateRepoHint': '安全要求:同步仓库必须为私有仓库(public 仓库会公开你的配置内容)。认证 token 仅用于仓库访问,绝不写入同步文件、提交内容或日志。';
@@ -186,80 +168,26 @@ export declare const uiZh: {
186
168
  readonly 'sync.pushOk': '推送成功(快照 {id})';
187
169
  readonly 'sync.conflictUnresolved': '冲突项 {id} 必须先选择解决方式(保留当前 / 使用导入)';
188
170
  readonly 'sync.pushPreviewHeadline': '将推送 {total} 个分区({changed} 个有变化)';
189
- readonly 'sync.pushPreviewHint': '以上为只读预览,不会写入远端。确认后点击「推送」才真正上传。';
190
171
  readonly 'sync.pushPreviewEncrypted': '加密快照:载荷将整体加密,各分区相对基线的变化不可比对。';
191
172
  readonly 'sync.pushPreviewCredentials': '本次推送包含真实凭据值(已随载荷整体加密;远端只见密文)。';
192
173
  readonly 'sync.pullFailed': '拉取失败';
193
174
  readonly 'sync.pullOk': '远端快照 {id} 差异预览:共 {count} 项变更';
194
175
  readonly 'sync.pullEmpty': '远端快照与本地一致(无变更)';
195
176
  readonly 'sync.previewHint': '以上为只读差异预览,不会执行导入。当前版本暂不支持一键导入;如需应用远端配置,请使用「导入恢复」向导手动导入导出的备份。';
196
- readonly 'sync.syncTitle': '一键同步';
197
- readonly 'sync.syncButton': '一键同步';
198
177
  readonly 'sync.syncing': '正在同步…';
199
- readonly 'sync.syncHeadline': '远端快照 {id} 差异确认:共 {count} 项';
200
- readonly 'sync.syncEmpty': '远端快照与本地一致(无变更)';
201
- readonly 'sync.syncFailed': '同步失败';
202
- readonly 'sync.confirmAdopt': '采用远端';
203
- readonly 'sync.confirmSkip': '跳过';
204
- readonly 'sync.confirmRequired': '需要人工决策';
205
- readonly 'sync.needsReviewBadge': '需人工决策';
206
- readonly 'sync.selectSnapshot': '选择历史快照';
207
- readonly 'sync.latestSnapshot': '最新快照';
208
- readonly 'sync.noSnapshots': '远端暂无快照';
209
- readonly 'sync.confirmImport': '确认导入';
210
- readonly 'sync.cancelConfirm': '取消';
211
- readonly 'sync.conflictResolve': '冲突解决';
212
- readonly 'sync.conflictUseLocal': '用本地';
213
- readonly 'sync.conflictUseRemote': '用远端';
214
- readonly 'sync.conflictSkip': '跳过';
215
- readonly 'sync.conflictResolvedLocal': '已选:本地';
216
- readonly 'sync.conflictResolvedRemote': '已选:远端';
217
- readonly 'sync.conflictResolvedSkip': '已选:跳过';
218
178
  readonly 'sync.importDone': '已导入 {n} 个分区';
219
179
  readonly 'sync.importPartial': '部分成功:{n} 项未生效(其余已写入,未整体回滚)';
220
- readonly 'sync.importSkipped': '已跳过 {n} 项';
221
180
  readonly 'sync.importFailed': '导入失败(已整体回滚)';
222
- readonly 'sync.rollbackButton': '回滚到应用前';
223
- readonly 'sync.rollingBack': '正在回滚…';
224
- readonly 'sync.rollbackDone': '已回滚到应用前';
225
- readonly 'sync.appliedSections': '已写入';
226
- readonly 'sync.importWarnings': '导入告警';
227
- readonly 'sync.autosyncTitle': '自动同步';
228
- readonly 'sync.autosyncDesc': '开启后,DSH 将按固定间隔自动执行双向同步(拉取合并 + 上传);DSH 启动时还会触发一次「自动下载合并(不上传)」以保持本地为最新。仅在无冲突且无需人工干预时才自动写入。';
229
- readonly 'sync.autosyncEnabled': '启用自动同步';
230
- readonly 'sync.autosyncInterval': '同步间隔';
231
- readonly 'sync.autosyncIntervalHint': 'DSH 启动时自动下载合并不上传。';
232
181
  readonly 'sync.autosyncNever': '从未运行';
233
182
  readonly 'sync.autosyncLastRun': '上次运行:{time}';
234
- readonly 'sync.autosyncNextIn': '下次约 {time} 后';
235
183
  readonly 'sync.autosyncSuccess': '成功';
236
184
  readonly 'sync.autosyncSkipped': '已跳过';
237
185
  readonly 'sync.autosyncFailed': '失败';
238
186
  readonly 'sync.autosyncPartial': '部分成功';
239
187
  readonly 'sync.autosyncFailCount': '连续失败 {n} 次';
240
- readonly 'sync.autosyncSyncing': '自动同步进行中…';
241
- readonly 'sync.interval.5m': '5 分钟';
242
- readonly 'sync.interval.15m': '15 分钟';
243
- readonly 'sync.interval.30m': '30 分钟';
244
- readonly 'sync.interval.60m': '60 分钟';
245
- readonly 'sync.interval.6h': '6 小时';
246
- readonly 'sync.interval.12h': '12 小时';
247
- readonly 'sync.interval.24h': '24 小时';
248
188
  readonly 'sync.duration.min': '{n} 分钟';
249
189
  readonly 'sync.duration.hour': '{n} 小时';
250
190
  readonly 'sync.duration.day': '{n} 天';
251
- readonly 'sync.hist.autosync': '自动同步';
252
- readonly 'sync.hist.directionPull': '下载';
253
- readonly 'sync.hist.directionPush': '上传';
254
- readonly 'sync.hist.directionBoth': '双向';
255
- readonly 'sync.hist.skipReasonConflict': '冲突项被跳过';
256
- readonly 'sync.hist.skipReasonNoRemote': '远端无快照';
257
- readonly 'sync.hist.skipReasonNotConfigured': '未配置仓库';
258
- readonly 'sync.hist.skipReasonNetwork': '网络问题';
259
- readonly 'sync.hist.conflictedSections': '跳过冲突分区:{sections}';
260
- readonly 'sync.hist.appliedSections': '应用分区:{sections}';
261
- readonly 'sync.hist.failedError': '错误:{error}';
262
- readonly 'sync.hist.notifiedAt': '已通知';
263
191
  readonly 'sync.github.starting': '正在发起 GitHub 授权…';
264
192
  readonly 'sync.github.waitingNoCode': '请在浏览器中打开授权页面并完成授权…';
265
193
  readonly 'sync.github.waiting': '请在浏览器中打开授权页面,输入一次性代码 {code} 完成授权(自动等待确认)。';
@@ -274,7 +202,6 @@ export declare const uiZh: {
274
202
  readonly 'sync.github.pollExpired': 'GitHub 授权已过期(expired_token)。请重新发起登录。';
275
203
  readonly 'sync.github.pollError': 'GitHub OAuth 错误:{detail}';
276
204
  readonly 'sync.github.unknownError': '未知错误';
277
- readonly 'market.statusLoading': '正在读取市场状态…';
278
205
  readonly 'market.statusUnconfigured': '尚未添加市场(请输入公开 Git 仓库地址)';
279
206
  readonly 'market.statusConfigured': '已添加 {count} 个市场';
280
207
  readonly 'market.supplyUnofficial': '来自公共网络、非官方审核';
@@ -319,13 +246,11 @@ export declare const uiZh: {
319
246
  readonly 'consult.dimensions': '评分维度';
320
247
  readonly 'consult.loading': '正在生成咨询报告…';
321
248
  readonly 'diskUsage.title': '磁盘占用';
322
- readonly 'diskUsage.total': '合计';
323
249
  readonly 'diskUsage.files': '{count} 个文件';
324
250
  readonly 'diskUsage.refresh': '重新体检';
325
251
  readonly 'diskUsage.loading': '正在统计磁盘占用…';
326
252
  readonly 'diskUsage.unreadable': '未统计';
327
- readonly 'diskUsage.partial': '部分目录读不到(已在对应行标注「未统计」),合计不含它们。';
328
- readonly 'diskUsage.retentionLabel': '自动回收';
253
+ readonly 'diskUsage.partial': '部分目录读不到:合计不含它们';
329
254
  readonly 'diskUsage.expiredHint': '其中 {size} 已到回收条件';
330
255
  readonly 'diskUsage.policy.regenerable': '可随时重建';
331
256
  readonly 'diskUsage.policy.retained': '{retention} 后自动回收';
@@ -371,8 +296,6 @@ export declare const uiZh: {
371
296
  readonly 'diskUsage.clean.nothing': '没有可释放的内容';
372
297
  readonly 'diskUsage.clean.nothingAbsent': '没有需要清理的内容(目标目录不存在或已为空)';
373
298
  readonly 'diskUsage.clean.failed': '清理完成,但有 {count} 项失败(已跳过)';
374
- readonly 'diskUsage.clean.excluded': '本次未包含:{items}';
375
- readonly 'diskUsage.clean.excludedExpiredExports': '回收过期备份文件';
376
299
  readonly 'diskUsage.clean.confirmTitle': '清理磁盘占用';
377
300
  readonly 'diskUsage.clean.confirmMessage': '将删除可重建的缓存与暂存,以及已过期的备份文件;快照与同步数据不受影响。此操作不可撤销,但被删内容都可重新生成。';
378
301
  readonly 'diskUsage.clean.confirm': '清理';
@@ -387,7 +310,7 @@ export declare const uiZh: {
387
310
  readonly 'diskUsage.area.rollbackPoints': '回滚点库';
388
311
  readonly 'diskUsage.area.rollbackPointsDesc': '每回合自动留点的快照(工作区 + 会话两态);只报告,不自动清理';
389
312
  readonly 'diskUsage.legacy.title': '遗留数据';
390
- readonly 'diskUsage.legacy.hint': '插件已不再读取这些目录,也不会自动删除它们;确认无用后可手动清理。它们不计入上方合计。';
313
+ readonly 'diskUsage.legacy.hint': '插件不再读取 · 不会自动删除 · 不计入上方合计';
391
314
  readonly 'diskUsage.legacy.label': '遗留数据';
392
315
  readonly 'library.kind.snapshot': '本机快照';
393
316
  readonly 'library.kind.backupFile': '备份文件';
@@ -474,12 +397,7 @@ export declare const uiZh: {
474
397
  readonly 'foreign.found.no': '未检测到';
475
398
  readonly 'foreign.paths': '命中路径:{paths}';
476
399
  readonly 'foreign.pathsNone': '没有命中任何真值表路径';
477
- readonly 'foreign.skipped.total': '未迁移 {count} 项';
478
- readonly 'foreign.skipped.empty': '没有未迁移的内容';
479
400
  readonly 'foreign.credentialRefs': '需补录凭据 {count} 项:{refs}';
480
- readonly 'foreign.credentialRefs.none': '无需补录凭据';
481
- readonly 'foreign.sections.none': '没有可导入的分区';
482
- readonly 'foreign.reportOnly': '只报告、不导入:{detail}';
483
401
  readonly 'foreign.skip.unsupported-hooks': 'settings 的 hooks:DSH 无对等结构,未迁移';
484
402
  readonly 'foreign.skip.unsupported-commands': '斜杠命令:与 DSH 提示词不是同一语义,本次未迁移';
485
403
  readonly 'foreign.skip.credentials-not-migrated': '凭据字段只记录名字,值不读取也不迁移';
package/lib/ui/i18n.js CHANGED
@@ -14,14 +14,9 @@ export const uiZh = {
14
14
  'commonClose': '关闭',
15
15
  'commonCancel': '取消',
16
16
  'commonRetry': '重试',
17
- 'commonLoading': '加载中…',
18
17
  'commonUnknownError': '未知错误',
19
- 'commonNext': '下一步',
20
- 'commonBack': '上一步',
21
- 'commonDone': '完成',
22
18
  // 导出
23
19
  'export.download': '下载备份文件',
24
- 'export.running': '正在导出…',
25
20
  'export.run': '开始导出',
26
21
  'export.selectionWarnings': '以下分区为设备相关数据,跨设备导入时可能不适用:',
27
22
  'export.included': '已包含',
@@ -59,7 +54,6 @@ export const uiZh = {
59
54
  'report.fullText': '完整文本报告(含逐项原因)',
60
55
  'report.secrets': '密钥:',
61
56
  'report.credentialsNeedEntry': '{count} 个凭据需要补录',
62
- 'report.restartRequired': '重启 DSH 后生效:{detail}',
63
57
  'report.restartPluginsMcp': '插件/MCP 更改将在重启 DSH 后生效',
64
58
  'report.rollbackFull': '回滚:已完整恢复导入前的配置。',
65
59
  'report.rollbackPartial': '回滚部分完成。',
@@ -74,7 +68,6 @@ export const uiZh = {
74
68
  'report.badgeRedacted': '{count} 项已脱敏',
75
69
  'report.rollback': '回滚',
76
70
  'report.action.fixIssues': '查看失败项',
77
- 'report.action.viewDetails': '查看详情',
78
71
  'report.includedSections': '已包含的分区',
79
72
  'report.excludedSections': '未包含的分区',
80
73
  'report.warnings': '注意事项',
@@ -90,7 +83,6 @@ export const uiZh = {
90
83
  'report.unit.workspaces': '个工作区',
91
84
  'report.unit.credentials': '项凭据状态',
92
85
  'report.unit.notes': '条说明',
93
- 'report.action.done': '完成',
94
86
  // 错误
95
87
  'error.notMounted': 'config-manager 服务未挂载(插件未加载):请确认 profile 中已安装 dsh-config-manager 并重启 DSH',
96
88
  'error.apiPathMissed': '接口路径未命中(HTTP {status}):请求前缀为 {base},但该路径没有返回 JSON —— 若你经反向代理挂在子路径下,请检查代理是否转发了这个前缀(issue #108)',
@@ -143,15 +135,7 @@ export const uiZh = {
143
135
  'progress.done': '已完成',
144
136
  'progress.failed': '已失败',
145
137
  // 快照
146
- 'snapshots.createdAt': '创建时间',
147
- 'snapshots.sourceZip': '来源',
148
138
  'snapshots.status': '状态',
149
- 'snapshots.entries': '条目',
150
- 'snapshots.plugins': '插件',
151
- 'snapshots.statusPending': '待处理',
152
- 'snapshots.statusDone': '已完成',
153
- 'snapshots.statusRolledback': '已回滚',
154
- 'snapshots.statusUnknown': '未知',
155
139
  'snapshots.planTitle': '恢复计划预览',
156
140
  'snapshots.confirmRestore': '确认恢复?会先把当前文件备份到一个安全位置,再删除导入期间新增的插件。',
157
141
  'snapshots.execute': '执行恢复',
@@ -162,8 +146,6 @@ export const uiZh = {
162
146
  'snapshots.failed': '失败',
163
147
  'snapshots.skipped': '跳过',
164
148
  'snapshots.noActions': '该快照无可恢复动作(或全部跳过)。',
165
- 'snapshots.empty': '暂无快照。导入时会自动创建安全快照。',
166
- 'snapshots.loading': '正在加载快照…',
167
149
  'snapshots.selectHint': '选择一个快照预览其恢复计划(只读预览,不会改动任何设置):',
168
150
  'snapshots.reportTitle': '恢复报告',
169
151
  // 同步区块(sync-view)
@@ -196,7 +178,6 @@ export const uiZh = {
196
178
  'sync.pushOk': '推送成功(快照 {id})',
197
179
  'sync.conflictUnresolved': '冲突项 {id} 必须先选择解决方式(保留当前 / 使用导入)',
198
180
  'sync.pushPreviewHeadline': '将推送 {total} 个分区({changed} 个有变化)',
199
- 'sync.pushPreviewHint': '以上为只读预览,不会写入远端。确认后点击「推送」才真正上传。',
200
181
  'sync.pushPreviewEncrypted': '加密快照:载荷将整体加密,各分区相对基线的变化不可比对。',
201
182
  'sync.pushPreviewCredentials': '本次推送包含真实凭据值(已随载荷整体加密;远端只见密文)。',
202
183
  'sync.pullFailed': '拉取失败',
@@ -204,76 +185,23 @@ export const uiZh = {
204
185
  'sync.pullEmpty': '远端快照与本地一致(无变更)',
205
186
  'sync.previewHint': '以上为只读差异预览,不会执行导入。当前版本暂不支持一键导入;如需应用远端配置,请使用「导入恢复」向导手动导入导出的备份。',
206
187
  // 一键同步(方案 A:拉取 → 逐项确认 → apply-items)
207
- 'sync.syncTitle': '一键同步',
208
- 'sync.syncButton': '一键同步',
209
188
  'sync.syncing': '正在同步…',
210
- 'sync.syncHeadline': '远端快照 {id} 差异确认:共 {count} 项',
211
- 'sync.syncEmpty': '远端快照与本地一致(无变更)',
212
- 'sync.syncFailed': '同步失败',
213
- 'sync.confirmAdopt': '采用远端',
214
- 'sync.confirmSkip': '跳过',
215
- 'sync.confirmRequired': '需要人工决策',
216
- 'sync.needsReviewBadge': '需人工决策',
217
- 'sync.selectSnapshot': '选择历史快照',
218
- 'sync.latestSnapshot': '最新快照',
219
- 'sync.noSnapshots': '远端暂无快照',
220
- 'sync.confirmImport': '确认导入',
221
- 'sync.cancelConfirm': '取消',
222
- 'sync.conflictResolve': '冲突解决',
223
- 'sync.conflictUseLocal': '用本地',
224
- 'sync.conflictUseRemote': '用远端',
225
- 'sync.conflictSkip': '跳过',
226
- 'sync.conflictResolvedLocal': '已选:本地',
227
- 'sync.conflictResolvedRemote': '已选:远端',
228
- 'sync.conflictResolvedSkip': '已选:跳过',
229
189
  'sync.importDone': '已导入 {n} 个分区',
230
190
  'sync.importPartial': '部分成功:{n} 项未生效(其余已写入,未整体回滚)',
231
- 'sync.importSkipped': '已跳过 {n} 项',
232
191
  'sync.importFailed': '导入失败(已整体回滚)',
233
- 'sync.rollbackButton': '回滚到应用前',
234
- 'sync.rollingBack': '正在回滚…',
235
- 'sync.rollbackDone': '已回滚到应用前',
236
- 'sync.appliedSections': '已写入',
237
- 'sync.importWarnings': '导入告警',
238
192
  // 自动同步(方案 A:宿主后台调度)
239
- 'sync.autosyncTitle': '自动同步',
240
- 'sync.autosyncDesc': '开启后,DSH 将按固定间隔自动执行双向同步(拉取合并 + 上传);DSH 启动时还会触发一次「自动下载合并(不上传)」以保持本地为最新。仅在无冲突且无需人工干预时才自动写入。',
241
- 'sync.autosyncEnabled': '启用自动同步',
242
- 'sync.autosyncInterval': '同步间隔',
243
- 'sync.autosyncIntervalHint': 'DSH 启动时自动下载合并不上传。',
244
193
  'sync.autosyncNever': '从未运行',
245
194
  'sync.autosyncLastRun': '上次运行:{time}',
246
- 'sync.autosyncNextIn': '下次约 {time} 后',
247
195
  'sync.autosyncSuccess': '成功',
248
196
  'sync.autosyncSkipped': '已跳过',
249
197
  'sync.autosyncFailed': '失败',
250
198
  'sync.autosyncPartial': '部分成功',
251
199
  'sync.autosyncFailCount': '连续失败 {n} 次',
252
- 'sync.autosyncSyncing': '自动同步进行中…',
253
- 'sync.interval.5m': '5 分钟',
254
- 'sync.interval.15m': '15 分钟',
255
- 'sync.interval.30m': '30 分钟',
256
- 'sync.interval.60m': '60 分钟',
257
- 'sync.interval.6h': '6 小时',
258
- 'sync.interval.12h': '12 小时',
259
- 'sync.interval.24h': '24 小时',
260
200
  // 自动同步倒计时(剩余时长插值)
261
201
  'sync.duration.min': '{n} 分钟',
262
202
  'sync.duration.hour': '{n} 小时',
263
203
  'sync.duration.day': '{n} 天',
264
204
  // 自动同步历史(kind=autosync 行渲染)
265
- 'sync.hist.autosync': '自动同步',
266
- 'sync.hist.directionPull': '下载',
267
- 'sync.hist.directionPush': '上传',
268
- 'sync.hist.directionBoth': '双向',
269
- 'sync.hist.skipReasonConflict': '冲突项被跳过',
270
- 'sync.hist.skipReasonNoRemote': '远端无快照',
271
- 'sync.hist.skipReasonNotConfigured': '未配置仓库',
272
- 'sync.hist.skipReasonNetwork': '网络问题',
273
- 'sync.hist.conflictedSections': '跳过冲突分区:{sections}',
274
- 'sync.hist.appliedSections': '应用分区:{sections}',
275
- 'sync.hist.failedError': '错误:{error}',
276
- 'sync.hist.notifiedAt': '已通知',
277
205
  // GitHub OAuth 区块
278
206
  'sync.github.starting': '正在发起 GitHub 授权…',
279
207
  'sync.github.waitingNoCode': '请在浏览器中打开授权页面并完成授权…',
@@ -290,7 +218,6 @@ export const uiZh = {
290
218
  'sync.github.pollError': 'GitHub OAuth 错误:{detail}',
291
219
  'sync.github.unknownError': '未知错误',
292
220
  // 配置市场(m-market-ui:market-view 纯渲染模型文案;React 壳文案在 config-manager-market 命名空间)
293
- 'market.statusLoading': '正在读取市场状态…',
294
221
  'market.statusUnconfigured': '尚未添加市场(请输入公开 Git 仓库地址)',
295
222
  'market.statusConfigured': '已添加 {count} 个市场',
296
223
  'market.supplyUnofficial': '来自公共网络、非官方审核',
@@ -337,13 +264,11 @@ export const uiZh = {
337
264
  'consult.dimensions': '评分维度',
338
265
  'consult.loading': '正在生成咨询报告…',
339
266
  'diskUsage.title': '磁盘占用',
340
- 'diskUsage.total': '合计',
341
267
  'diskUsage.files': '{count} 个文件',
342
268
  'diskUsage.refresh': '重新体检',
343
269
  'diskUsage.loading': '正在统计磁盘占用…',
344
270
  'diskUsage.unreadable': '未统计',
345
- 'diskUsage.partial': '部分目录读不到(已在对应行标注「未统计」),合计不含它们。',
346
- 'diskUsage.retentionLabel': '自动回收',
271
+ 'diskUsage.partial': '部分目录读不到:合计不含它们',
347
272
  'diskUsage.expiredHint': '其中 {size} 已到回收条件',
348
273
  'diskUsage.policy.regenerable': '可随时重建',
349
274
  'diskUsage.policy.retained': '{retention} 后自动回收',
@@ -390,8 +315,6 @@ export const uiZh = {
390
315
  // e2e-F3:目标目录不存在/已空**不是失败**(全新安装时 market/cache 尚未创建)
391
316
  'diskUsage.clean.nothingAbsent': '没有需要清理的内容(目标目录不存在或已为空)',
392
317
  'diskUsage.clean.failed': '清理完成,但有 {count} 项失败(已跳过)',
393
- 'diskUsage.clean.excluded': '本次未包含:{items}',
394
- 'diskUsage.clean.excludedExpiredExports': '回收过期备份文件',
395
318
  'diskUsage.clean.confirmTitle': '清理磁盘占用',
396
319
  'diskUsage.clean.confirmMessage': '将删除可重建的缓存与暂存,以及已过期的备份文件;快照与同步数据不受影响。此操作不可撤销,但被删内容都可重新生成。',
397
320
  'diskUsage.clean.confirm': '清理',
@@ -407,7 +330,7 @@ export const uiZh = {
407
330
  'diskUsage.area.rollbackPoints': '回滚点库',
408
331
  'diskUsage.area.rollbackPointsDesc': '每回合自动留点的快照(工作区 + 会话两态);只报告,不自动清理',
409
332
  'diskUsage.legacy.title': '遗留数据',
410
- 'diskUsage.legacy.hint': '插件已不再读取这些目录,也不会自动删除它们;确认无用后可手动清理。它们不计入上方合计。',
333
+ 'diskUsage.legacy.hint': '插件不再读取 · 不会自动删除 · 不计入上方合计',
411
334
  'diskUsage.legacy.label': '遗留数据',
412
335
  // 产物库(UI v2 §6):四源合并成一张混合平铺列表
413
336
  'library.kind.snapshot': '本机快照',
@@ -499,12 +422,7 @@ export const uiZh = {
499
422
  'foreign.found.no': '未检测到',
500
423
  'foreign.paths': '命中路径:{paths}',
501
424
  'foreign.pathsNone': '没有命中任何真值表路径',
502
- 'foreign.skipped.total': '未迁移 {count} 项',
503
- 'foreign.skipped.empty': '没有未迁移的内容',
504
425
  'foreign.credentialRefs': '需补录凭据 {count} 项:{refs}',
505
- 'foreign.credentialRefs.none': '无需补录凭据',
506
- 'foreign.sections.none': '没有可导入的分区',
507
- 'foreign.reportOnly': '只报告、不导入:{detail}',
508
426
  'foreign.skip.unsupported-hooks': 'settings 的 hooks:DSH 无对等结构,未迁移',
509
427
  'foreign.skip.unsupported-commands': '斜杠命令:与 DSH 提示词不是同一语义,本次未迁移',
510
428
  'foreign.skip.credentials-not-migrated': '凭据字段只记录名字,值不读取也不迁移',
@@ -595,13 +513,8 @@ export const uiEn = {
595
513
  'commonClose': 'Close',
596
514
  'commonCancel': 'Cancel',
597
515
  'commonRetry': 'Retry',
598
- 'commonLoading': 'Loading…',
599
516
  'commonUnknownError': 'Unknown error',
600
- 'commonNext': 'Next',
601
- 'commonBack': 'Back',
602
- 'commonDone': 'Done',
603
517
  'export.download': 'Download backup file',
604
- 'export.running': 'Exporting…',
605
518
  'export.run': 'Start Export',
606
519
  'export.selectionWarnings': 'Device-specific sections may not apply on another machine:',
607
520
  'export.included': 'Included',
@@ -637,7 +550,6 @@ export const uiEn = {
637
550
  'report.fullText': 'Full text report (with per-item reasons)',
638
551
  'report.secrets': 'Secrets:',
639
552
  'report.credentialsNeedEntry': '{count} credential(s) need to be entered',
640
- 'report.restartRequired': 'Restart DSH to apply: {detail}',
641
553
  'report.restartPluginsMcp': 'Plugin / MCP changes take effect after restarting DSH',
642
554
  'report.rollbackFull': 'Rollback: fully restored the pre-import configuration.',
643
555
  'report.rollbackPartial': 'Rollback partially completed.',
@@ -650,7 +562,6 @@ export const uiEn = {
650
562
  'report.badgeRedacted': '{count} redacted',
651
563
  'report.rollback': 'Rollback',
652
564
  'report.action.fixIssues': 'View failures',
653
- 'report.action.viewDetails': 'View details',
654
565
  'report.includedSections': 'Included sections',
655
566
  'report.excludedSections': 'Excluded sections',
656
567
  'report.warnings': 'Warnings',
@@ -666,7 +577,6 @@ export const uiEn = {
666
577
  'report.unit.workspaces': 'workspace(s)',
667
578
  'report.unit.credentials': 'credential status item(s)',
668
579
  'report.unit.notes': 'note(s)',
669
- 'report.action.done': 'Done',
670
580
  'error.notMounted': 'config-manager service is not mounted (plugin not loaded): make sure dsh-config-manager is installed in the profile and restart DSH',
671
581
  'error.apiPathMissed': 'API path not matched (HTTP {status}): the request prefix is {base} but that path did not return JSON — if you serve DSH under a reverse-proxy sub-path, check that this prefix is proxied (issue #108)',
672
582
  'error.httpInvalidJson': 'HTTP {status}: invalid JSON response',
@@ -716,15 +626,7 @@ export const uiEn = {
716
626
  'progress.recovering': 'Recovering / rolling back...',
717
627
  'progress.done': 'Done',
718
628
  'progress.failed': 'Failed',
719
- 'snapshots.createdAt': 'Created',
720
- 'snapshots.sourceZip': 'Source',
721
629
  'snapshots.status': 'Status',
722
- 'snapshots.entries': 'Entries',
723
- 'snapshots.plugins': 'Plugins',
724
- 'snapshots.statusPending': 'Pending',
725
- 'snapshots.statusDone': 'Done',
726
- 'snapshots.statusRolledback': 'Rolled back',
727
- 'snapshots.statusUnknown': 'Unknown',
728
630
  'snapshots.planTitle': 'Restore Plan Preview',
729
631
  'snapshots.confirmRestore': 'Confirm restore? Current files are first backed up to a safe location, then plugins added during the import are removed.',
730
632
  'snapshots.execute': 'Restore now',
@@ -735,8 +637,6 @@ export const uiEn = {
735
637
  'snapshots.failed': 'Failed',
736
638
  'snapshots.skipped': 'Skipped',
737
639
  'snapshots.noActions': 'No restorable actions for this snapshot (or all skipped).',
738
- 'snapshots.empty': 'No snapshots yet. A safety snapshot is created automatically on import.',
739
- 'snapshots.loading': 'Loading snapshots…',
740
640
  'snapshots.selectHint': 'Select a snapshot to preview its restore plan (read-only preview, changes nothing):',
741
641
  'snapshots.reportTitle': 'Restore Report',
742
642
  'sync.privateRepoHint': 'Security requirement: the sync repository MUST be private (a public repo would expose your configuration). The auth token is only used for repository access and is never written into sync files, commit content, or logs.',
@@ -768,80 +668,26 @@ export const uiEn = {
768
668
  'sync.pushOk': 'Push succeeded (snapshot {id})',
769
669
  'sync.conflictUnresolved': 'Conflict item {id} must be resolved first (keep current / use imported)',
770
670
  'sync.pushPreviewHeadline': 'Will push {total} section(s) ({changed} changed)',
771
- 'sync.pushPreviewHint': 'Read-only preview above — nothing is written to the remote. Click "Push" to actually upload.',
772
671
  'sync.pushPreviewEncrypted': 'Encrypted snapshot: the payload is encrypted as a whole; per-section changes vs the baseline cannot be compared.',
773
672
  'sync.pushPreviewCredentials': 'This push includes real credential values (encrypted with the payload; the remote only ever sees ciphertext).',
774
673
  'sync.pullFailed': 'Pull failed',
775
674
  'sync.pullOk': 'Remote snapshot {id} diff preview: {count} change(s)',
776
675
  'sync.pullEmpty': 'Remote snapshot matches local (no changes)',
777
676
  'sync.previewHint': 'Read-only diff preview above; nothing is imported. One-click import is not supported in this version — use the Import wizard to apply a downloaded backup if needed.',
778
- 'sync.syncTitle': 'One-Click Sync',
779
- 'sync.syncButton': 'One-click sync',
780
677
  'sync.syncing': 'Syncing…',
781
- 'sync.syncHeadline': 'Remote snapshot {id} diff confirm: {count} item(s)',
782
- 'sync.syncEmpty': 'Remote snapshot matches local (no changes)',
783
- 'sync.syncFailed': 'Sync failed',
784
- 'sync.confirmAdopt': 'Adopt remote',
785
- 'sync.confirmSkip': 'Skip',
786
- 'sync.confirmRequired': 'Needs decision',
787
- 'sync.needsReviewBadge': 'Needs decision',
788
- 'sync.selectSnapshot': 'Select snapshot',
789
- 'sync.latestSnapshot': 'Latest snapshot',
790
- 'sync.noSnapshots': 'No remote snapshots',
791
- 'sync.confirmImport': 'Confirm import',
792
- 'sync.cancelConfirm': 'Cancel',
793
- 'sync.conflictResolve': 'Resolve conflict',
794
- 'sync.conflictUseLocal': 'Use local',
795
- 'sync.conflictUseRemote': 'Use remote',
796
- 'sync.conflictSkip': 'Skip',
797
- 'sync.conflictResolvedLocal': 'Chosen: local',
798
- 'sync.conflictResolvedRemote': 'Chosen: remote',
799
- 'sync.conflictResolvedSkip': 'Chosen: skip',
800
678
  'sync.importDone': 'Imported {n} section(s)',
801
679
  'sync.importPartial': 'Partly successful: {n} item(s) did not take effect (the rest were written; nothing rolled back)',
802
- 'sync.importSkipped': 'Skipped {n} item(s)',
803
680
  'sync.importFailed': 'Import failed (rolled back)',
804
- 'sync.rollbackButton': 'Rollback',
805
- 'sync.rollingBack': 'Rolling back…',
806
- 'sync.rollbackDone': 'Rolled back',
807
- 'sync.appliedSections': 'Written',
808
- 'sync.importWarnings': 'Import warnings',
809
- 'sync.autosyncTitle': 'Auto Sync',
810
- 'sync.autosyncDesc': 'When enabled, DSH will run two-way sync (pull merge + push) on a fixed interval; on startup it also triggers a download-merge (no upload) to keep local up to date. Local writes happen only when there are no conflicts or manual-decision items.',
811
- 'sync.autosyncEnabled': 'Enable auto sync',
812
- 'sync.autosyncInterval': 'Sync interval',
813
- 'sync.autosyncIntervalHint': 'Auto download-merge on DSH startup, no upload.',
814
681
  'sync.autosyncNever': 'Never run',
815
682
  'sync.autosyncLastRun': 'Last run: {time}',
816
- 'sync.autosyncNextIn': 'Next in ~{time}',
817
683
  'sync.autosyncSuccess': 'Success',
818
684
  'sync.autosyncSkipped': 'Skipped',
819
685
  'sync.autosyncFailed': 'Failed',
820
686
  'sync.autosyncPartial': 'Partial',
821
687
  'sync.autosyncFailCount': '{n} consecutive failure(s)',
822
- 'sync.autosyncSyncing': 'Auto sync running…',
823
- 'sync.interval.5m': '5 min',
824
- 'sync.interval.15m': '15 min',
825
- 'sync.interval.30m': '30 min',
826
- 'sync.interval.60m': '60 min',
827
- 'sync.interval.6h': '6 hr',
828
- 'sync.interval.12h': '12 hr',
829
- 'sync.interval.24h': '24 hr',
830
688
  'sync.duration.min': '{n} min',
831
689
  'sync.duration.hour': '{n} hr',
832
690
  'sync.duration.day': '{n} day',
833
- 'sync.hist.autosync': 'Auto Sync',
834
- 'sync.hist.directionPull': 'Pull',
835
- 'sync.hist.directionPush': 'Push',
836
- 'sync.hist.directionBoth': 'Both',
837
- 'sync.hist.skipReasonConflict': 'Conflict items skipped',
838
- 'sync.hist.skipReasonNoRemote': 'No remote snapshot',
839
- 'sync.hist.skipReasonNotConfigured': 'No repository configured',
840
- 'sync.hist.skipReasonNetwork': 'Network issue',
841
- 'sync.hist.conflictedSections': 'Skipped conflict sections: {sections}',
842
- 'sync.hist.appliedSections': 'Applied sections: {sections}',
843
- 'sync.hist.failedError': 'Error: {error}',
844
- 'sync.hist.notifiedAt': 'Notified',
845
691
  'sync.github.starting': 'Starting GitHub authorization…',
846
692
  'sync.github.waitingNoCode': 'Open the authorization page in your browser and complete the flow…',
847
693
  'sync.github.waiting': 'Open the authorization page in your browser, enter the one-time code {code} to finish (waiting for confirmation).',
@@ -856,7 +702,6 @@ export const uiEn = {
856
702
  'sync.github.pollExpired': 'GitHub authorization expired (expired_token). Please re-start the sign-in.',
857
703
  'sync.github.pollError': 'GitHub OAuth error: {detail}',
858
704
  'sync.github.unknownError': 'Unknown error',
859
- 'market.statusLoading': 'Reading market status…',
860
705
  'market.statusUnconfigured': 'No markets added (enter a public Git repository URL)',
861
706
  'market.statusConfigured': '{count} market(s) added',
862
707
  'market.supplyUnofficial': 'From the public network, not officially reviewed',
@@ -901,13 +746,11 @@ export const uiEn = {
901
746
  'consult.dimensions': 'Score dimensions',
902
747
  'consult.loading': 'Generating consultation report…',
903
748
  'diskUsage.title': 'Disk Usage',
904
- 'diskUsage.total': 'Total',
905
749
  'diskUsage.files': '{count} file(s)',
906
750
  'diskUsage.refresh': 'Re-scan',
907
751
  'diskUsage.loading': 'Measuring disk usage…',
908
752
  'diskUsage.unreadable': 'not measured',
909
- 'diskUsage.partial': 'Some directories are unreadable (marked "not measured"); they are excluded from the total.',
910
- 'diskUsage.retentionLabel': 'Auto-cleanup',
753
+ 'diskUsage.partial': 'Some directories are unreadable: excluded from the total',
911
754
  'diskUsage.expiredHint': '{size} is past its retention window',
912
755
  'diskUsage.policy.regenerable': 'Regenerated on demand',
913
756
  'diskUsage.policy.retained': 'Auto-removed after {retention}',
@@ -953,8 +796,6 @@ export const uiEn = {
953
796
  'diskUsage.clean.nothing': 'Nothing to reclaim',
954
797
  'diskUsage.clean.nothingAbsent': 'Nothing to clean (the target directories are missing or already empty)',
955
798
  'diskUsage.clean.failed': 'Cleanup finished with {count} failure(s) (skipped)',
956
- 'diskUsage.clean.excluded': 'Not included this time: {items}',
957
- 'diskUsage.clean.excludedExpiredExports': 'Reclaim expired backups',
958
799
  'diskUsage.clean.confirmTitle': 'Clean disk usage',
959
800
  'diskUsage.clean.confirmMessage': 'This deletes regenerable caches/staging plus expired backup files; snapshots and sync data are untouched. It cannot be undone, but everything removed can be regenerated.',
960
801
  'diskUsage.clean.confirm': 'Clean',
@@ -970,7 +811,7 @@ export const uiEn = {
970
811
  'diskUsage.area.rollbackPoints': 'Rollback points',
971
812
  'diskUsage.area.rollbackPointsDesc': 'Automatic per-turn snapshots (workspace + session state); reported only, never auto-cleaned',
972
813
  'diskUsage.legacy.title': 'Legacy data',
973
- 'diskUsage.legacy.hint': 'The plugin no longer reads these directories and never deletes them automatically; clear them by hand once you are sure they are unused. They are not part of the total above.',
814
+ 'diskUsage.legacy.hint': 'No longer read · never auto-deleted · not part of the total above',
974
815
  'diskUsage.legacy.label': 'Legacy data',
975
816
  // Artifact library (UI v2 §6)
976
817
  'library.kind.snapshot': 'Local snapshot',
@@ -1059,12 +900,7 @@ export const uiEn = {
1059
900
  'foreign.found.no': 'Not detected',
1060
901
  'foreign.paths': 'Matched paths: {paths}',
1061
902
  'foreign.pathsNone': 'No truth-table path matched',
1062
- 'foreign.skipped.total': '{count} item(s) not migrated',
1063
- 'foreign.skipped.empty': 'Nothing was left unmigrated',
1064
903
  'foreign.credentialRefs': '{count} credential(s) to enter manually: {refs}',
1065
- 'foreign.credentialRefs.none': 'No credentials to enter',
1066
- 'foreign.sections.none': 'No importable sections',
1067
- 'foreign.reportOnly': 'Reported only, not imported: {detail}',
1068
904
  'foreign.skip.unsupported-hooks': 'settings hooks: DSH has no equivalent, not migrated',
1069
905
  'foreign.skip.unsupported-commands': 'Slash commands: not the same thing as DSH prompts, not migrated this round',
1070
906
  'foreign.skip.credentials-not-migrated': 'Credential fields: only the names are recorded; the values are never read or migrated',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-config-manager",
3
- "version": "0.1.84",
3
+ "version": "0.1.85",
4
4
  "license": "MIT",
5
5
  "description": "Backup, restore, export, import, migrate and sync your DeepSeek Harness (DSH) configuration: settings, plugins, MCP servers, skills, agent presets and workspaces. One-click migration to another machine. DSH 配置一键备份、恢复、导出、导入、迁移与同步插件。",
6
6
  "icon": "./icon.svg",