dsh-packer:把 DSH 本地配置按模块打包成标准 zip

前言

用 DeepSeek Harness(DSH)一段时间后,本地 ~/.dsh 下会积累不少资产:自己写的 skills、历史会话、profile 配置、全局设置、记忆数据。换机器或重装时,这些文件散落在不同目录,手动找齐再拷过去很容易遗漏;想把几个 skill 发给别人,又不确定文件里是否带着本地路径或密钥。

dsh-packer 针对的就是这两件事:把本地 DSH 资产按模块打包成标准 zip,一条链路覆盖迁移(整套环境搬过去)与分享(只把该给的给别人),打包前的隐私扫描贯穿两种场景。

这是什么

dsh-packer 是 DSH 的「Agent 配置打包器」插件,由 KLRSL 维护,MIT 许可证,当前版本 v0.2.2(2026-09-05)。DSH 的理念是「一切皆插件」,插件通过 dsh plugin 命令安装进 profile,这个插件本身也遵循同一套机制。

它的能力分三块:按模块组合打包、打包与恢复前后的预览校验、隐私安全扫描,全部按需开启。下面分别介绍。

核心功能

模块化打包与双模式预设

六个模块任意组合:

模块 内容
skills Skills,位于 ~/.dsh/skills
sessions 会话记录(.zstd 格式),位于 ~/.dsh/sessions
profiles Profile 配置(不含 node_modules),位于 ~/.dsh/profiles
settings 全局设置(settings.yaml
presets Agent 预设(.agent-presets
memory 记忆数据(DSH_MEMORY_ROOT~/.dsh/memory,不含 backups/

两个预设模式:

1、迁移(migrate):全部模块默认勾选,适合搬迁整套环境;

2、分享(share):只勾 skills,会话与记忆自动排除,个人 skill 子目录 _shared 也会排除,让敏感内容尽可能少进包。

隐私安全扫描

打包前对文本文件做扫描,规则包括:本地绝对路径、用户目录路径、疑似密钥 / Token(api_keysecretpasswordtokenbearerauthorization 等赋值)、个人昵称、Windows 用户名路径。

拦截策略按模式区分:分享模式命中任何规则即报错、强制拦截、不生成包;迁移模式仅报告不拦截,可以先用 /pack scan--dry-run 查看命中点,自行判断。

另外,.credentials.yaml.anonymous-user-id 永不进包——遍历任何模块时一律跳过,无论迁移还是分享。

打包与恢复的可预览性

打包前可以预览文件级清单,--dry-run 模式不生成 zip;恢复前先出差异报告,按新增 / 变更 / 相同 / 跳过四类列出文件,确认后再应用。

恢复冲突策略

对冲突文件三选一:overwrite(覆盖)、skip(跳过)、merge(文本追加,不覆盖已有内容)。注意 JSON / YAML 等结构化配置不支持 merge——追加即损坏,这类文件请用覆盖或手工合并。

清单完整性校验与路径安全

包内清单 manifest.json 记录 schemaVersion 与每个文件的 SHA-256 指纹;恢复前做 fail-closed 校验,任何一项不匹配就整体拒绝、不应用任何文件。恢复路径还做 containment 校验,zip-slip 或篡改清单的 ../ 越界一律拒绝。

包管理

包列表展示创建时间、大小、包含模块、备注,支持删除、重命名,打包时可以填写备注。分享包会自动生成并附带一份 README.md 说明包内容。

界面与实现

1、设置页提供「配置打包」标签页(模块勾选 / 预设切换 / 预览 / 打包 / 恢复 / 包管理),与 /pack 命令等价;

2、打包工作流面板跟随 DSH 主题做深色模式适配(--dsw-alias-* 变量,双通道探测);

3、零原生 npm 依赖:使用系统 bsdtar(libarchive)生成标准 zip,任何解压工具可打开。Windows 10+ 自带 tar.exe(即 bsdtar),macOS 的 tar 就是 bsdtar。

安装与启用

从 GitHub 安装,需要机器上已装 git:

dsh plugin --profile web add github:KLRSL/dsh-packer

其中 --profile web 是示例,换成自己的 profile 名。安装完成后需重启 DSH。

本地开发可以直接 link:

dsh plugin --profile web add link:./dsh-packer

环境要求:

Node.js ≥ 22.19.0
DSH 依赖 ≥ 0.1.1-rc.2(v0.2.2 已适配并实测 0.1.2-rc.1)
peer 依赖:@deepseek-ai/cordis ^4.0.2、@deepseek-ai/dsh-tools ≥0.1.1-rc.2、@deepseek-ai/dsh-session ≥0.1.1-rc.2

安装后验证,任选其一:

1、打开设置页的「配置打包」标签页,能看到模块勾选界面即安装成功;

2、运行 /pack list,返回包列表(首次为空)即命令已注册;

3、运行 /pack create --dry-run,预览文件清单与扫描结果,确认各模块路径可读。

典型用法

先做预览,确认要打包的内容:

/pack create --mode migrate --dry-run

这一步不生成 zip,只输出文件清单与扫描结果。确认无误后再创建迁移包,默认全选模块:

/pack create --note "迁移到新机器"

或者创建分享包,只含 Skills:

/pack create --share --note "分享给朋友"

打包结果写入 ~/.dsh/packs/

恢复时先导入包并查看差异报告:

/pack restore ~/.dsh/packs/dsh-packer-2026-09-05-223045-migrate.zip

再指定冲突策略应用:

/pack restore <zip路径> --strategy merge

策略取值 overwrite | skip | merge

其余两个常用命令:

/pack list    # 列出已有包:时间/大小/模块/备注
/pack scan    # 对所有可打包模块做隐私扫描

输出位置由三个环境变量控制,均有默认值:

环境变量 默认值 说明
DSH_PACKS_DIR ~/.dsh/packs 打包输出目录
DSH_MEMORY_ROOT ~/.dsh/memory memory 模块数据位置
DSH_HOME ~/.dsh 各模块路径基准

适用场景与注意

适合两类人:一是要换机器或重装、想把整套 DSH 环境完整搬走的用户;二是想把 skills 分享给别人、又不想手工排查敏感内容的用户。个人备份用迁移模式即可(仅报告隐私命中),但这类包不要发给别人。

几点注意:

1、分享模式刻意严格,命中任何隐私规则都会拦截。先跑 /pack scan 看哪些文件命中,清理后再打包;

2、JSON / YAML 等结构化配置恢复时不能用 merge,选覆盖或手工合并;

3、恢复时若 manifest 校验失败,说明包缺失清单、版本不兼容或包被改动过,重新生成或重新分发原包,不要手工解压修改 zip 内容;

4、插件以当前 dsh 进程的权限运行,能读写 ~/.dsh 下的文件。安装任何第三方插件前,建议先检查其源码与许可证(本项目为 MIT)。

小结

经过上面的步骤,DSH 本地配置的迁移与分享可以收拢成一条命令链路:--dry-run 预览、/pack create 打包、/pack restore 校验后恢复,隐私扫描在分享场景强制把关。如果你在维护多台机器上的 DSH 环境,或者经常给别人发 skill,可以装一份试试。

仓库地址:https://github.com/KLRSL/dsh-packer

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜