把 ZCode 配置安全迁移到 DSH 并支持回滚
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/21 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Dongmingyue-loss/zcode-to-dsh-migrate该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · desktop
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 58 处,展示前 48 条)
- 执行外部命令固定命令bin/zcode2dsh.js:160
const result = spawnSync('tasklist', ['/FI', `IMAGENAME eq ${name}`, '/NH'], { - 读取本地文件bin/zcode2dsh.js:336
if (fs.existsSync(exe)) { - 执行外部命令来自配置/变量bin/zcode2dsh.js:337
spawn(exe, [], { detached: true, stdio: 'ignore' }).unref(); - 读取本地文件bin/zcode2dsh.js:397
if (fs.existsSync(target.dshHome)) ok(`DSH home: ${target.dshHome}`); - 读取本地文件bin/zcode2dsh.js:400
if (fs.existsSync(target.profileDir)) ok(`Profile: ${target.profileDir}`); - 读取本地文件bin/zcode2dsh.js:403
if (fs.existsSync(target.patchPath)) ok(`Patch: ${target.patchPath}`); - 读取本地文件bin/zcode2dsh.js:406
if (fs.existsSync(target.credentialsPath)) ok(`Credentials: ${target.credentialsPath}`); - 读取本地文件bin/zcode2dsh.js:409
if (fs.existsSync(target.envPath)) ok(`Env file: ${target.envPath}`); - 读取本地文件lib/discover.js:12
if (fs.existsSync(candidate)) return candidate; - 读取本地文件lib/discover.js:85
if (!fs.existsSync(drive)) continue; - 读取本地文件lib/yaml.js:21
if (!fs.existsSync(pkg)) continue; - 读取本地文件lib/yaml.js:29
if (fs.existsSync(direct)) return require(direct); - 读取本地文件lib/migrate.js:375
const exists = fs.existsSync(target.agentsPath); - 读取本地文件lib/migrate.js:725
const oldText = fs.existsSync(target.agentsPath) ? readText(target.agentsPath) : ''; - 读取本地文件lib/migrate.js:811
originalText: fs.existsSync(target.agentsPath) ? readText(target.agentsPath) : '', - 写入本地文件lib/diff.js:29
fs.writeFileSync(oldFile, oldText, 'utf8'); - 写入本地文件lib/diff.js:30
fs.writeFileSync(newFile, newText, 'utf8'); - 执行外部命令固定命令lib/diff.js:32
const result = spawnSync('git', [ - 删除本地文件lib/diff.js:64
fs.rmSync(tempDir, { recursive: true, force: true }); - 读取本地文件lib/backup.js:19
text = fs.readFileSync(file, 'utf8'); - 读取本地文件lib/backup.js:38
while (fs.existsSync(candidate)) { - 读取本地文件lib/backup.js:69
const stat = fs.statSync(targetPath); - 读取本地文件lib/backup.js:72
buffer = fs.readFileSync(targetPath); - 写入本地文件lib/backup.js:79
fs.writeFileSync(backupPath, buffer); - 读取本地文件lib/backup.js:109
if (!fs.existsSync(backupPath)) { - 读取本地文件lib/backup.js:113
const buffer = fs.readFileSync(backupPath); - 写入本地文件lib/backup.js:203
fs.writeFileSync(temp, buffer); - 写入本地文件lib/backup.js:205
fs.renameSync(temp, targetPath); - 写入本地文件lib/backup.js:208
fs.copyFileSync(temp, targetPath); - 删除本地文件lib/backup.js:209
fs.unlinkSync(temp); - 删除本地文件lib/backup.js:225
fs.unlinkSync(file.targetPath); - 读取本地文件lib/util.js:8
return fs.readFileSync(file, 'utf8'); - 读取本地文件lib/util.js:13
return fs.readFileSync(file, 'utf8'); - 读取本地文件lib/util.js:23
text = fs.readFileSync(file, 'utf8'); - 写入本地文件lib/util.js:54
fs.mkdirSync(dir, { recursive: true }); - 写入本地文件lib/util.js:61
fs.writeFileSync(temp, content, 'utf8'); - 写入本地文件lib/util.js:63
fs.renameSync(temp, file); - 读取本地文件lib/util.js:67
if (fs.existsSync(file)) { - 写入本地文件lib/util.js:68
fs.copyFileSync(temp, file); - 删除本地文件lib/util.js:69
fs.unlinkSync(temp); - 读取本地文件lib/util.js:107
return fs.statSync(file).isFile(); - 读取本地文件lib/util.js:115
return fs.readdirSync(dir, { withFileTypes: true }) - 读取本地文件lib/dsh-app.js:12
return fs.existsSync(path.join(dir, 'package.json')); - 执行外部命令固定命令lib/dsh-app.js:38
const result = spawnSync('powershell.exe', [ - 读取本地文件lib/dsh-app.js:73
if (!fs.existsSync(drive)) continue; - 读取本地文件lib/sources/common.js:8
const stat = fs.statSync(file); - 读取本地文件lib/sources/common.js:26
return { file, mtime: fs.statSync(file).mtimeMs }; - 读取本地文件lib/sources/common.js:127
return fs.readdirSync(sharedRoot, { withFileTypes: true })
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
把 ZCode / ZCodium 配置迁移到 DSH Desktop Beta,带冲突检测、备份,报告不泄露密钥。
README
由 DeepSeek 最新模型翻译生成zcode2dsh
本地工具,把 ZCode / ZCodium 里可迁移的配置转移到 DSH Desktop Beta。
- 读取:Provider、模型、API Key、MCP server、全局 AGENTS.md、代理设置
- 写入:DSH profile 的 cordis.patch.yml、.credentials.yaml、.env、AGENTS.md
- 默认不覆盖 DSH 已有配置
- 所有写入前自动备份,支持一键恢复
- 全程不打印明文密钥
- 提供 scan / plan / apply / restore / doctor / diff
跨产品配置模型不同,100% 无损不可能。本工具保证:可映射字段都有确定映射;不可映射字段逐项写入报告;不静默丢弃;不覆盖已有配置。
一、快速开始
要求:Windows + Node.js 18+,DSH Desktop Beta 已安装。
展开完整文档(README 剩余 1 节)
zcode2dsh 本地工具,把 ZCode / ZCodium 里可迁移的配置转移到 DSH Desktop Beta。 - 读取:Provider、模型、API Key、MCP server、全局 AGENTS.md、代理设置 - 写入:DSH profile 的 cordis.patch.yml、.credentials.yaml、.env、AGENTS.md - 默认不覆盖 DSH 已有配置 - 所有写入前自动备份,支持一键恢复 - 全程不打印明文密钥 - 提供 scan / plan / apply / restore / doctor / diff 跨产品配置模型不同,100% 无损不可能。本工具保证:可映射字段都有确定映射;不可映射字段逐项写入报告;不静默丢弃;不覆盖已有配置。 一、快速开始 要求:Windows + Node.js 18+,DSH Desktop Beta 已安装。 cd /d <解压目录> :: 1. 体检 node bin\zcode2dsh.js doctor :: 2. 只读盘点 node bin\zcode2dsh.js scan :: 3. 查看将执行的动作和 diff(不写文件) node bin\zcode2dsh.js plan :: 4. 确认后应用(建议先关闭 DSH Desktop Beta) node bin\zcode2dsh.js apply :: 5. 如需回滚 node bin\zcode2dsh.js restore --backup <备份ID> 也可以使用 zcode2dsh.cmd: zcode2dsh.cmd scan zcode2dsh.cmd plan zcode2dsh.cmd apply 二、默认路径 源 | 内容 | 官方 ZCode | ZCodium | | Provider 配置 | <dataBaseDir>\.zcode\v2\config.json | <ZCODIUM_DATA_BASE_DIR>\.zcodium\v2\provider_config.json | | Provider 顺序 | 同目录 model-provider-display-order.json | 配置内 providerOrder | | MCP / skills | %USERPROFILE%\.zcode\cli\config.json | %USERPROFILE%\.zcodium\cli\config.json | | 设置 | %USERPROFILE%\.zcode\v2\setting.json | %USERPROFILE%\.zcodium\v2\setting.json | | 全局指令 | %USERPROFILE%\.zcode\AGENTS.md | %USERPROFILE%\.zcodium\AGENTS.md | - 官方 ZCode 的数据根优先读取 setting.json 的 dataBaseDir,失败时回退 %USERPROFILE%\.zcode。 - ZCodium 的数据根来自 --zcodium-config、ZCODIUM_DATA_BASE_DIR,或自动探测。 - 找不到时可用 --zcode-config / --zcodium-config 直接指定文件。 目标 | 内容 | 路径 | | Profile patch | %USERPROFILE%\.dsh-beta\profiles\desktop\cordis.patch.yml | | 凭据 | %USERPROFILE%\.dsh-beta\.credentials.yaml | | 代理 | %USERPROFILE%\.dsh-beta\.env | | 全局指令 | %USERPROFILE%\.dsh-beta\AGENTS.md | | Skills | 不复制;DSH 扫描共享目录 %USERPROFILE%\.agents\skills | DSH home 可用 --dsh-home 或 DSH_HOME 覆盖。 DSH 安装目录(用于加载自带 yaml 包)会自动从 --dsh-app、DSH_APP_DIR、%LOCALAPPDATA%、%PROGRAMFILES%、卸载注册表和常见盘符中探测。 路径都可以用参数覆盖,见下文。 三、映射规则 Provider | ZCode kind | DSH api | | anthropic | anthropic-messages | | openai-compatible | openai-completions | | openai | openai-responses | - Provider key:zcode-<providerId前8位> 或 zcodium-<slug>;冲突自动加后缀。 - displayName 使用 ZCode 的 provider 名称。 - baseURL 原样保留。 - API Key 不写进 cordis.patch.yml: - 生成 ref:ZCODE_<8HEX>_API_KEY / ZCODIUM_<SLUG>_API_KEY - 写入 .credentials.yaml 的 refs - provider 配置只写 apiKeyEnv - 跳过:enabled: false、systemDisabledReason、空 Key、无模型、未知 kind。 - 保留 model-provider-display-order.json 的顺序。 Model - id = 实际发给 provider 的 wire model id。ZCode 模型带 name 字段时,name 才是 wire id;否则使用模型对象键。 - name = ZCode 模型对象键,作为 DSH 界面上的显示名。 - 示例:ZCode 对象键 deepseek-v4.1-flash、name: deepseek-v4-flash → DSH id: deepseek-v4-flash、name: deepseek-v4.1-flash。 - contextWindow = limit.context。 - maxTokens = limit.output。 - input = modalities.input,只保留 text / image;其他模态报告丢弃。 - reasoning: - 默认省略 reasoningEfforts,避免把 ZCode 的 max / enabled 直接当成网关 wire 值导致请求失败; - 报告中保留源端 variants / defaultVariant; - --reasoning map 可做直接映射(off → null,enabled → high,其他同名)。 - zcode.modified、zcode.priority、deletedModels 等元数据不迁移,报告中说明。 MCP - type: http → transport: streamable-http,映射 url、headers、timeoutMs → toolCallTimeoutMs。 - type: stdio → transport: stdio,映射 command、args、env、cwd。 - type: sse 不支持,报告中跳过。 - 每个 server 追加一条 id: mcp--<serverName> 的顶层条目。 - HTTP Authorization 头原样保留;plan 的 diff 会脱敏,实际写入的配置中包含原值。 代理 - 读取 setting.json 的 httpProxy。 - 写入 $DSH_HOME/.env: - http_proxy=http://<host:port> - https_proxy=http://<host:port> - DSH 只支持 HTTP 代理,不支持 SOCKS/PAC;遇到 socks5:// 跳过并报告。 - 启动环境已有 HTTP_PROXY / HTTPS_PROXY 时,启动环境优先于 .env。 AGENTS.md 与 Skills - 全局 AGENTS.md 原样复制到 $DSH_HOME/AGENTS.md;目标已存在时默认保留。 - Skills 不复制:DSH 已扫描 ~/.agents/skills,与 ZCode 共用。 - ZCode cli/config.json 中 enable: false 的 skill 在 DSH 中仍会可见;DSH 没有等价的逐 skill 开关,报告会提示。 默认模型 - 默认不改变 DSH 现有的 agent-default-model。 - --set-default 时从 ZCode 最新日志的 runtimeModel 检测;检测失败需显式 --default <provider>/<model>。 - 示例:--set-default 或 --default zcode-0624d1ca/gemini-3.8-flash。 四、冲突策略 --conflict: | 策略 | 行为 | | keep(默认) | 保留 DSH 已有 provider / credential ref / AGENTS / .env / 默认模型,只新增不存在的项;冲突逐项报告 | | prefer-zcode | 用 ZCode 值覆盖冲突项,覆盖前备份 | | fail | 遇到任何冲突立即中止,不写任何文件 | 已有 deepseek provider 和 DEEPSEEK_API_KEY 永远保留;迁移项使用独立 key 和 ref,不共享、不覆盖。 凭据 ref 冲突时: - 值相同:直接复用; - 值不同且策略为 keep:创建 _2 后缀的新 ref,不覆盖原值; - 值不同且策略为 prefer-zcode:覆盖原 ref; - 值不同且策略为 fail:中止。 五、命令与参数 zcode2dsh scan [options] 只读盘点 zcode2dsh plan [options] 输出动作、冲突、diff zcode2dsh apply [options] 备份 → 写入 → 校验 → 报告 zcode2dsh restore --backup ID 恢复指定备份 zcode2dsh doctor [options] 检查路径、YAML、凭据、进程状态 zcode2dsh diff [options] 只输出 diff 常用参数: | 参数 | 说明 | | --source zcode\|zcodium\|all | 源,默认 zcode | | --dsh-home <path> | DSH home,默认 %USERPROFILE%\.dsh-beta | | --profile <name> | DSH profile,默认 desktop | | --dsh-app <path> | DSH resources/app,用于加载自带 yaml 包 | | --conflict keep\|prefer-zcode\|fail | 冲突策略 | | --reasoning omit\|map | 推理等级映射 | | --set-default | 设置 DSH 默认模型 | | --default <provider>/<model> | 显式设置默认模型 | | --no-providers | 跳过 provider | | --no-mcp | 跳过 MCP | | --no-proxy | 跳过代理 | | --no-agents | 跳过 AGENTS.md | | --backup <id> | 恢复用的备份 ID | | --backup-dir <path> | 备份目录 | | --report-dir <path> | 报告目录 | | --force | DSH 正在运行时仍允许 apply/restore | | --restart | apply 成功后启动 DSH | | --dry-run | 等同于 plan | | --json | 机器可读输出 | | --verbose | 额外诊断 | 测试/调试用的路径覆盖: --zcode-config、--zcode-order、--zcode-cli、--zcode-setting、--zcode-agents、--zcodium-config、--zcodium-cli、--zcodium-setting、--zcodium-agents、--patch-path、--credentials-path、--dsh-env-path、--dsh-agents-path。 六、备份与恢复 每次真正写入前,会在 backups/<时间戳>/ 保存: - cordis.patch.yml - .credentials.yaml - .env - AGENTS.md(如果当时存在) - manifest.json(路径、SHA256、大小、源、冲突策略、变更列表) 备份中的 .credentials.yaml 包含凭据原文,仅用于回滚。不要把 backups/ 目录分享或上传。 恢复: node bin\zcode2dsh.js restore --backup 2026-10-19T14-30-00-000Z - restore 先校验备份 hash; - 恢复前会再创建一个 pre-restore-<时间戳> 备份; - 迁移时新建、迁移前不存在的文件,需要 --force 才会删除; - 恢复路径必须在 DSH home 内,否则拒绝。 七、安全设计 1. 密钥零输出:scan / plan / 日志 / JSON / HTML 只显示“已配置”或 ref 名;diff 中的凭据文件只显示“diff omitted”,MCP Authorization 头会脱敏。 2. YAML 保真:用 yaml 的 Document API 只修改目标节点,保留现有 deepseek provider、注释和顺序;解析失败立即中止。 3. 凭据保真:保留 .credentials.yaml 全部现有 refs 和 records;只新增缺失 ref;格式不合法时不覆盖。 4. 原子写入:同目录临时文件 + rename;写入后重新解析校验;失败自动回滚。 5. 幂等:重复 apply 不重复添加 provider/MCP/ref;第二次运行报告“无变化”。 6. 运行状态:默认要求关闭 DSH 后写入,--force 才允许运行中写入。 7. 不修改源:ZCode / ZCodium 的安装目录和数据只读。 八、已知不可迁移项 - 会话历史:ZCode SQLite → DSH zstd JSONL,格式不兼容。 - ZCode 插件:DSH Cordis 插件模型不同。 - OAuth 登录态:只迁移静态 API Key。 - UI 设置:最近项目、托盘、更新、Web 遥控等不迁移。 - 逐 skill 开关:DSH 扫描共享 ~/.agents/skills,没有 ZCode 的 enable: false 等价配置。 - 推理默认等级:ZCode 的 defaultVariant 没有 DSH 等价字段;默认不写 reasoningEfforts。 - Provider 显示顺序:DSH 没有显式排序字段,按配置插入顺序展示。 - zcode.modified / priority / deletedModels:仅元数据,不迁移。 这些都会写入 migration-report.json 的 warnings / skippedProviders / modelReport 中。 九、输出报告 apply 会在 reports/ 生成: - <timestamp>.json:完整迁移摘要(无密钥) - <timestamp>.html:可读报告(无密钥,diff 已脱敏) 报告内容包括: - 源/目标路径 - 每个 provider 的映射结果和 action - 跳过的 provider 及原因 - MCP 映射 - 代理、AGENTS、默认模型 - 凭据 ref 更新(只显示名称) - 冲突、警告 - 备份 ID 和文件变更 十、开发与测试 cd /d <解压目录> node test\run-tests.js 测试覆盖: - provider/model/MCP/代理/AGENTS 映射 - ZCodium 适配器 - 默认模型检测 - apply 写入、幂等、restore 字节级恢复 - dry-run 不写文件 - 凭据冲突 keep / fail - YAML 注释保留 - 报告不含明文密钥 依赖:只使用 DSH 安装目录自带的 yaml 包(通过 --dsh-app 定位),不额外联网安装。 十一、常见问题 Q:apply 后 DSH 没看到新 provider? A:先完全退出 DSH 再重新启动。Profile patch 不一定热加载;凭据文件会热重载。 Q:代理没生效? A:DSH 启动环境中的 HTTP_PROXY / HTTPS_PROXY 优先于 $DSH_HOME/.env。检查启动 DSH 的终端/快捷方式环境变量。 Q:某个 provider 的请求失败? A:先看 plan 报告里的 modelReport 和 api。ZCode 的 openai kind 映射为 openai-responses;如果网关只支持 chat completions,需要手工把该 provider 的 api 改成 openai-completions,或使用 --conflict prefer-zcode 后编辑配置。 Q:如何只迁移 MCP? A:zcode2dsh apply --no-providers --no-agents --no-proxy。 Q:如何只迁移 provider? A:zcode2dsh apply --no-mcp --no-agents --no-proxy。 Q:会改 ZCode 吗? A:不会。工具只读取 ZCode / ZCodium 配置,写入目标是 DSH。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Dongmingyue-loss/zcode-to-dsh-migrate
把 ZCode 配置安全迁移到 DSH 并支持回滚
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2
这是你的仓库?认领条目