🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

配置迁移助手 ygcdsj/dsh-home-migrate

DeepSeek Harnessv0.0.11
ygcdsj73 天前有提交已提供中文文档扫描:含敏感能力

打包本机 DSH 配置,换机一键还原并自动回滚

28.8/100
综合分
2
GitHub 星标
34
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-migrate
npm 源 · dsh-migrate 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]✓
静态安装检查通过
未做真实安装
L4 · 真实安装等级说明 →
数据截至 2026/10/24·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 73 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-migrate @ 0.0.11
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/24 11:37:37

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 85 处,展示前 41 条)
  • 发起网络请求
    lib/client.js:42
    csrfToken = (await (await fetch("/dsh-migrate/api/session", { method: "GET" })).json()).token ?? null;
  • 发起网络请求
    lib/client.js:44
    return (await fetch(path, {
  • 写入剪贴板
    lib/client.js:208
    if (navigator.clipboard?.writeText) navigator.clipboard.writeText(path).then(done).catch(() => done());
  • 执行外部命令固定命令
    lib/export.js:23
    const r = spawnSync('dsh', ['--version'], { shell: process.platform === 'win32', timeout: 10_000, encoding: 'utf8' });
  • 读取本地文件
    lib/export.js:50
    pkg = JSON.parse(readFileSync(f.absPath, 'utf8'));
  • 读取本地文件
    lib/export.js:95
    const raw = readFileSync(f.absPath, 'utf8');
  • 写入本地文件
    lib/export.js:153
    mkdirSync(outDir, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/import.js:32
    const r = spawnSync(cmd, args, {
  • 读取本地文件
    lib/import.js:45
    while (existsSync(join(home, 'profiles', name)))
  • 写入本地文件
    lib/import.js:51
    mkdirSync(dest, { recursive: true });
  • 读取本地文件
    lib/import.js:52
    for (const entry of readdirSync(src, { withFileTypes: true })) {
  • 写入本地文件
    lib/import.js:60
    mkdirSync(dirname(d), { recursive: true });
  • 写入本地文件
    lib/import.js:61
    copyFileSync(s, d);
  • 读取本地文件
    lib/import.js:77
    const vendorHasPkg = existsSync(vendorDir) && readdirSync(vendorDir).some((n) => {
  • 读取本地文件
    lib/import.js:77
    const vendorHasPkg = existsSync(vendorDir) && readdirSync(vendorDir).some((n) => {
  • 读取本地文件
    lib/import.js:79
    return lstatSync(join(vendorDir, n)).isDirectory();
  • 读取本地文件
    lib/import.js:85
    const profiles = existsSync(profilesDir)
  • 写入本地文件
    lib/import.js:162
    mkdirSync(backupDir, { recursive: true });
  • 写入本地文件
    lib/import.js:164
    mkdirSync(staging, { recursive: true });
  • 写入本地文件
    lib/import.js:187
    copyFileSync(targetSettings, join(backupDir, 'settings.yaml'));
  • 删除本地文件递归
    lib/import.js:306
    rmSync(staging, { recursive: true, force: true });
  • 删除本地文件
    lib/import.js:308
    rmdirSync(join(home, '.dshmig-staging'));
  • 删除本地文件递归
    lib/import.js:318
    rmSync(p, { recursive: true, force: true });
  • 删除本地文件
    lib/import.js:328
    rmSync(targetSettings, { force: true });
  • 删除本地文件递归
    lib/import.js:332
    rmSync(staging, { recursive: true, force: true });
  • 删除本地文件
    lib/import.js:334
    rmdirSync(join(resolve(opts.home ?? resolveDshHome()), '.dshmig-staging'));
  • 读取本地文件
    lib/routes.js:80
    const sz = statSync(body.archive).size;
  • 写入本地文件
    lib/routes.js:101
    writeFileSync(file, buf);
  • 删除本地文件递归
    lib/routes.js:103
    rmSync(dir, { recursive: true, force: true });
  • 读取本地文件
    lib/scan.js:22
    entries = readdirSync(absDir, { withFileTypes: true });
  • 读取本地文件
    lib/scan.js:43
    size = statSync(abs).size;
  • 读取本地文件
    lib/scan.js:53
    if (!existsSync(manifestPath))
  • 读取本地文件
    lib/scan.js:57
    pkg = JSON.parse(readFileSync(manifestPath, 'utf8'));
  • 读取本地文件
    lib/scan.js:89
    if (existsSync(settingsPath) && lstatSync(settingsPath).isFile()) {
  • 读取本地文件
    lib/scan.js:89
    if (existsSync(settingsPath) && lstatSync(settingsPath).isFile()) {
  • 读取本地文件
    lib/manifest.js:10
    return createHash('sha256').update(readFileSync(absPath)).digest('hex');
  • 写入本地文件
    lib/archive.js:26
    mkdirSync(dirname(outPath), { recursive: true });
  • 写入本地文件
    lib/archive.js:27
    renameSync(tmp, outPath);
  • 发起网络请求
    lib/client/index.js:38
    const s = await fetch('/dsh-migrate/api/session', { method: 'GET' });
  • 发起网络请求
    lib/client/index.js:44
    const r = await fetch(path, {
  • 写入剪贴板
    lib/client/index.js:162
    navigator.clipboard.writeText(path).then(done).catch(() => done());
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-tools@deepseek-ai/dsh-client-ui-slots
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 打包本机配置
  • 换机一键还原
  • 自动回滚

一个插件,把本地的 DSH 配置(皮肤、预设、注入包)打包成文件,到另一台 Windows 上直接还原。

v0.0.112026-08-23
适配 dsh 0.1.1-rc.2 — 依赖区间收紧到 ^0.1.1-rc.2(新装不再 ERR_PNPM_NO_MATCHING_VERSION)
v0.0.102026-08-21
· dsh-migrate 0.0.10 · 🐛 修复:导出去重 · 多个 profile 共享同一 vendor 包时,导出会把 vendor/ 文件、links、manifest 条目重复 N 倍(归档膨胀、导入时警告与验证重复) · 修复:collectLinks 按依赖名去重(同一 vendor 包只记一条 link);扫描结果按路径去重(纵深防御,覆盖不同依赖指向同一 vendor 目录的边角) · 效果:归档体积恢复正常,导入不再出现重复的 vendor 跳过警告与重复验证项
v0.0.92026-08-20
· dsh-migrate 0.0.9 · ✨ 新功能:迁移自动"带自己" · 导出自携带:导出时自动把 dsh-migrate 自身附加进归档内的 profile(dependencies + dsh.profile.bundles) · 目标机导入后即自带迁移工具,无需再手动 dsh plugin --profile add dsh-migrate · 幂等:profile 已显式依赖时不重复附加;源机文件只读不改;dry-run 预览与导出报告会提示 · 解决"迁移不带自己"(此前 super-injector 运行时注入的工具不在 profile 依赖里,不随迁移走) · 🐛 修复:全新安装 404 · 依赖区间 >=0.0.1-rc =0.1.0-rc.8 <2,精确解析到已验证可装的 0.1.0-rc.8 新图(实测通过) · 📚 文档 · FAQ:补充「重命名 profile 目录后 dsh plugin 报 ERR_PNPM_UNEXPECTED_VIRTUAL_STORE」的成因与修复(pnpm 虚拟商店路径写死,删 node_modules 重建即可) · FAQ:更新「迁移包会带 dsh-migrate 自己吗」——0.0.9 起自动携带 · docs/DEVELOPMENT.md §6.1 补自携带说明
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-migrate 实验性 — DSH 配置迁移工具:导出/打包 → 换机还原 → 校验 + 回滚。 npm version npm downloads license 从任意 DSH 安装打包配置,在目标机还原为新建 profile,全程校验、失败自动回滚。不做云、不做历史、不做跨品牌。 工作流程 dsh-migrate 迁移流程总览 与现有项目的区别 | 项目 | 定位 | dsh-migrate 的边界 | | dshmarket(dsh-market)Backup & Restore | 市场内 profile 插件层备份/恢复 | 我们不碰插件市场;dsh-migrate 覆盖 vendor/ link 目录、.agent-presets、settings.yaml、凭据脱敏——归档格式互通是 v2 目标 | | dsh-backup-sync | 本地快照 + WebDAV 跨机同步 | 备份/同步 ≠ 迁移;我们做“打包 → 换机还原”完整闭环 | | dsh-backup | 一键备份 + 定时 + sha256 + 轮转 | 同上 | | dsh-session-sync | 会话库 git 镜像 | 我们 MVP 明确不做 sessions |
展开完整文档(README 剩余 1 节)
dsh-migrate

实验性 — DSH 配置迁移工具:导出/打包 → 换机还原 → 校验 + 回滚。

npm version
npm downloads
license

从任意 DSH 安装打包配置,在目标机还原为新建 profile,全程校验、失败自动回滚。不做云、不做历史、不做跨品牌。

工作流程

dsh-migrate 迁移流程总览

与现有项目的区别

| 项目 | 定位 | dsh-migrate 的边界 |
| dshmarket(dsh-market)Backup & Restore | 市场内 profile 插件层备份/恢复 | 我们不碰插件市场;dsh-migrate 覆盖 vendor/ link 目录、.agent-presets、settings.yaml、凭据脱敏——归档格式互通是 v2 目标 |
| dsh-backup-sync | 本地快照 + WebDAV 跨机同步 | 备份/同步 ≠ 迁移;我们做“打包 → 换机还原”完整闭环 |
| dsh-backup | 一键备份 + 定时 + sha256 + 轮转 | 同上 |
| dsh-session-sync | 会话库 git 镜像 | 我们 MVP 明确不做 sessions |
| dsh-movein / DSH-Portable | 导入(Claude Code → DSH)/ 便携构建 | 反向或不同形态,不冲突 |

功能(MVP)

- 导出:扫描 ~/.dsh(profiles 配置、settings.yaml、.agent-presets、vendor/ link 目录);硬排除 .credentials.yaml/.env/.pnpm-store/sessions/storages/node_modules 等;settings/presets 做字段级凭据扫描 + 脱敏,处理明细进 manifest(secretReport)
- 打包:单一 .dshmig(zip),内置 manifest(版本、平台、文件清单、sha256 校验和、link 映射)
- 导入:预检(同 OS、dsh 版本、磁盘)→ 备份目标机 → 默认新建 profile(-migrated,重名自动递增)→ link: 路径重算 → vendor/presets/settings 还原 → pnpm install → 验证链(链接解析 → dsh --dump-config)→ 失败自动回滚
- 验证链:L1 pnpm install / L2 link 解析(junction realpath)/ L3 dsh --dump-config
- 界面:设置页「迁移」入口(导出向导 + 导入向导);host 工具 dsh_migrate_export / dsh_migrate_import 可被 agent 直接调用

MVP 明确不做(v2 或生态)

sessions/storages 迁移、WebDAV/Gist 云同步、跨品牌导入、便携化、跨 OS 迁移、覆盖现有 profile、无人值守自动迁移、凭据管理(只排除 + 脱敏 + 引导重配)。

安装

发布到 npm 后:

在 profile 目录内
dsh plugin --profile web add dsh-migrate

本地开发/注入(需要 dsh-super-injector):

npm install --legacy-peer-deps --no-audit --no-fund
npm run build # 构建(无 bash/无源码 checkout 时自动降级 _npx 缓存官方包树)
注入器环境内: dev_inject_plugin

完整迁移流程(第一次使用)

1. 源机导出:设置 → 迁移 → 导出 → ① 预览导出内容 → ② 执行导出
2. 拿到产物:.dshmig 文件生成在 ~/dsh-migrate-exports/dsh-migrate--.dshmig——一个 zip,内含 manifest(校验清单)、profile 配置、settings.yaml(已脱敏)、.agent-presets、vendor/ link 包;凭据尽力排除/脱敏(secretReport 含 unscannedFiles 未扫描清单,传输前请核对)
3. 传输:U 盘 / 网盘 / scp 均可(脱敏尽力而为,请以 secretReport 为准)
4. 目标机导入:目标机 DSH → 设置 → 迁移 → 导入 → 粘贴 .dshmig 路径 → ① 预检(逐项 ✓/✗)→ 确认步骤清单 → ② 执行导入
5. 等待验证:自动执行 pnpm install + 验证链(L1 安装 / L2 链接解析 / L3 dsh --dump-config),全部通过才收尾
6. 切换使用:导入为新建 profile(-migrated),验证通过后手动切换默认 profile;确认无误后清理 ~/.dsh/.dshmig-backup/

启动迁移后的 profile(重要):dsh web 是 dsh --profile web 的别名,永远启动原生的 web profile——迁移成果在新建的 -migrated profile 里,必须显式指定:

dsh --profile web-migrated # 启动迁移后的 profile(GUI)

用 dsh web 打开的是未迁移的原生环境,自然看不到迁移过来的插件/皮肤/设置,这不是故障。web 是 dsh CLI 的硬编码别名(dsh web ≡ dsh --profile web),DSH 没有默认 profile 也没有切换命令。要让 dsh web 直接启动迁移后的环境,唯一方式是重命名 profile 目录:确认迁移无误后,先停用/移走旧 web 目录,再把 -migrated 重命名为 web(两者都在 $DSH_HOME/profiles/ 下);不确定时继续用 dsh --profile -migrated 显式启动。⚠ 目录改名后 pnpm 会报 ERR_PNPM_UNEXPECTED_VIRTUAL_STORE(虚拟商店路径失配,pnpm 已知行为),修复方法见 FAQ。

导入全程不覆盖你现有的 profile;任何一步失败自动回滚。

用法

设置页向导(推荐)

1. 导出:设置 → 迁移 → 预览导出内容(文件清单/大小/排除项/疑似凭据)→ 执行导出 → 产物在 ~/dsh-migrate-exports/.dshmig
2. 导入:目标机设置 → 迁移 → 输入 .dshmig 路径 → 预检(逐项 ✓/✗)→ 确认步骤清单 → 执行 → 查看验证链结果与备份目录
3. 验证通过后手动切换默认 profile 使用;.dshmig-backup/ 确认无误后可手动清理

Host 工具

dsh_migrate_export { dryRun: true }(预览)/ { dryRun: false, outDir }(打包);dsh_migrate_import { archive, dryRun: true }(预检)/ { archive }(导入,失败自动回滚)。

安全边界

dsh-migrate 导入安全门禁

- 凭据尽力排除/脱敏,非绝对保证:.credentials.yaml、.env 硬排除;settings/presets/vendor 配置文件内疑似凭据字段自动脱敏()并记录于 secretReport;未扫描文件清单(unscannedFiles)随报告导出,请核对后再传输
- vendor 包配置文件内的凭据会原地脱敏:迁移不搬运凭据的必然代价——迁移后的 vendor 包若依赖被脱敏的值(如 API token),需要在目标机重新配置;README/导出报告会提示
- 导入 = 执行归档中的代码:导入会 pnpm install(默认 --ignore-scripts)并解析 bundle 插件,之后启动该 profile 会执行其中插件——仅导入你信任的来源(UI 确认框有醒目警告)
- 导出产物只在本机生成;上传/传输由用户自行负责
- link: 目标断言在 /vendor 内(防路径逃逸);manifest 路径字段(files/links/profiles)白名单校验 + 落地断言(防穿越写盘)
- HTTP API 仅本机回环(Host 白名单)+ CSRF token + Origin 同源 + Sec-Fetch-Site 校验;将 DSH web 暴露到局域网 = 任何人可导入任意归档(RCE 面)
- settings.yaml 为符号链接时拒绝覆盖(防穿透写目标)
- 并发导入各自独立 staging 子目录,互不清理

FAQ

导入会覆盖我现在的配置吗? 不会。MVP 只新建 profile(-migrated);settings.yaml 在备份后覆盖(可在导入前取消勾选)。

为什么 dsh web 看不到迁移的插件? dsh web 只是 dsh --profile web 的硬编码别名,启动的是原生的 web profile;迁移工具不覆盖现有 profile,成果都在新建的 -migrated 里。请用 dsh --profile -migrated 启动。确认迁移无误后,可停用旧 profile 并把 -migrated 重命名为 web($DSH_HOME/profiles/ 下改目录名即可,DSH 无默认 profile 机制),此后 dsh web 即启动迁移后的环境。

跨 OS 可以迁移吗? MVP 限定同 OS;跨 OS 会在预检阶段明确拒绝。

目标机已经用过(装过插件/皮肤)还能导入吗? 可以。导入只新建 profile(-migrated),不覆盖你现有的任何 profile;settings.yaml 会先备份再覆盖(导入前可取消勾选);vendor 同名包跳过或校验一致、冲突只报告不覆盖。预检的 target-used 项会以警告(⚠)提示目标机状态(已有 vendor 包 / 非默认 profile / 迁移历史),不阻断导入;需要"目标机必须原生未动"的严格模式时,host 工具可传 requireFresh: true。
重命名 profile 目录后 dsh plugin 报 ERR_PNPM_UNEXPECTED_VIRTUAL_STORE 怎么办? pnpm 会把虚拟商店的绝对路径写进 node_modules/.modules.yaml(virtualStoreDir 字段),profile 目录改名/复制后该路径失配,pnpm 就拒绝一切增删改——这是 pnpm 的已知行为,与迁移工具无关(dsh web 仍能正常启动,因为运行时加载走链接、不校验这个字段)。解决:停掉 dsh → 删除该 profile 目录下的 node_modules(pnpm-lock.yaml 在目录里不会丢)→ 重新执行 dsh plugin --profile add (或在该目录跑 pnpm install),pnpm 会按锁文件重建全部依赖。

迁移包会带 dsh-migrate 自己吗? 从 0.0.9 起会:导出时工具自动把自身附加进归档内 profile(dependencies 加 dsh-migrate@^ + dsh.profile.bundles 追加),目标机导入后即自带迁移工具,无需手动安装(幂等:profile 已显式依赖时不重复附加;导入会从 npm 安装,需网络)。历史版本(≤0.0.8)不带:迁移只搬运 profile 的声明内容,而通过运行时注入(super-injector)挂载的工具不在 profile 依赖里——那时需目标机手动 dsh plugin --profile add dsh-migrate。

git: 依赖(skin 类)怎么办? 不打包,目标机 pnpm install 时重新拉取(需网络/凭据),预检会提示。

导入安全吗? 导入会执行归档内的代码(pnpm install 安装脚本 + bundle 插件解析,之后启动 profile 还会执行插件),所以只导入你信任的来源。默认 --ignore-scripts 禁止依赖安装脚本;路径字段白名单 + 落地断言防穿越;HTTP API 仅回环 + token 可调。

导入失败了会怎样? 配置级完全回滚(删除新建内容 + 恢复快照),依赖级尽力恢复;.dshmig-backup/ 保留现场,绝不静默。

开发与测试

npm test # 冒烟(导出→导入→重写/还原/递增/故障注入),沙箱内可跑
npm run test:install # 完整链路(pnpm install + dump-config,需完整权限)

规格与设计决策见 docs/DEVELOPMENT.md(本机实测基线、生态惯例、勘察结论、风险登记)。

安全审查与修复记录:原始审查报告见 docs/SECURITY_REVIEW.md,核查与修复验证见 docs/VERIFICATION.md。

路线图(v2)

- sessions/storages 迁移(借鉴 dsh-session-sync git 镜像思路)
- 与 dshmarket 备份格式互通
- WebDAV/Gist 同步
- 跨 OS(实现已按跨 OS 设计,仅承诺保守)

许可证

MIT © 2026 dsh-migrate contributors

致谢

- dshmarket — 路由/HTTP 模式、pnpm 兼容层、备份模块参照
- dsh-super-injector — 插件形态与构建管线参照
- dsh-skin-market — pnpm 失败处理参照
- dsh-backup-sync、dsh-backup、dsh-session-sync — 生态定位对照
- DeepSeek Harness — 官方平台与 @deepseek-ai/dsh-home-paths 等标准包
预览分享卡片长什么样 ↓ygcdsj/dsh-home-migrate
分享 · DeepSeek Harness Hub
ygcdsj/dsh-home-migrate

打包本机 DSH 配置,换机一键还原并自动回滚

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部