DeepSeek Harness profile 怎么重建?from-default-profile 与失败回滚
--from-default-profile 不是“把旧 profile 升级到新模板”,而是“用一个全新模板副本把旧目录替换掉”。 新 profile 只保留模板当前的组合包列表,原有依赖、用户 patch 和本地改动都会被删除。它适合把损坏或严重跑偏的自定义 profile 拉回可用状态,不适合想保留配置的日常升级。
DeepSeek Harness:它到底替换什么、保留什么
替换的边界很硬:模板带来的留下,旧目录里的东西全部消失。 对照如下:(来源)
| 内容 | 重建后 |
|---|---|
| 模板当前的组合包列表 | 写入新 manifest |
| 已安装依赖 | 清空 |
用户 cordis.patch.yml | 清空 |
| 旧 profile 的继承字段 | 不保留 |
| 内置组合包 | 仍从当前 dsh 安装目录解析 |
新副本的 manifest 依赖为空、用户 patch 为空。它不会读取同名的本地模板 profile,也不会复制那个 profile 的依赖或 patch。模板列表之后的变化,也不会自动改写已经建好的新 profile。
这就是为什么它更像“重置”而不是“升级”。如果你的目标是保留插件、只更新基础组合,应该改 dsh.profile.bundles 或重装插件,而不是用这个参数。
DeepSeek Harness:三种适用场景
它最适合“目标 profile 已经不可信,但我想从干净模板重新开始”的情况。 三种场景:(来源)
- 救援 profile —
dsh rescue --from-default-profile web,把rescue按 web 模板重建。预期:得到一个干净、可启动的 Web profile。 - 复现默认行为 — 怀疑自定义 profile 被 patch 污染,重建后对比默认表现。预期:排除本地配置干扰。
- 废弃实验 profile — 实验失败后不想逐项清理,直接按模板重置。预期:目录回到初始状态,再按需重装。
如果只是想新建一个 profile,不需要先建再替换;直接用 --from-default-profile 建一个新名字即可。这个参数在“目标已存在”时才是破坏性的。
DeepSeek Harness:命令与执行顺序
启动器不是直接删目录,而是先在旁边组装,再移动替换;理解这个顺序才能理解失败时为什么还能找回旧目录。 执行链路:(来源)
- 校验目标名 — 目标不能是
web、headless、sdk、sdk-minimal、acp的任何大小写形式。预期:用自定义名字,例如rescue。 - 在暂存目录组装 — 在目标旁边创建
.staging-*目录,写入模板副本。预期:组装期间旧目录仍然可用。 - 移动到目标位置 — 先把新目录移到目标,再删除旧目录。预期:目标只保留一份完整副本。
- 提交后再启动 — 替换在组合包解析和启动之前完成。预期:后续启动失败不会自动回滚。
示例:
# 把 rescue 这个自定义 profile 按 web 模板重建
dsh rescue --from-default-profile web
# 之后正常启动(不再带替换参数)
dsh rescue
成功后启动器不会额外输出“已替换”之类的提示;不要因为没看到提示就重复执行。
如果重建后马上要装回插件,建议先启动一次确认 profile 可用,再批量安装。这样能把“模板本身有问题”和“插件把配置弄坏”分开,排错时少一层变量。重建后的第一次启动也不要带额外的 --patch,先把模板基线跑通。
确认基线的标志很简单:能进界面、能新建会话、没有插件解析错误。三条都满足,再去装东西。
DeepSeek Harness:失败与回滚
官方给了两层恢复:移动失败先自动恢复,恢复不了再保留 previous 目录。 处理顺序:(来源)
- 移动失败 — 启动器尝试恢复原目录。预期:目标仍是旧 profile。
- 恢复也失败 — 原目录保留在
$DSH_HOME/profiles/.<name>.staging-*/previous。预期:可以手动移回。 - 进程在两次重命名之间停止 — 同样会留下 previous 目录。预期:不要清空
.staging-*,先检查里面有没有完整副本。 - 并发替换同一目标 — 至少一个会成功,目标中只保留一份完整副本。预期:不要并行跑多个重建命令。
手动恢复时,先停掉使用该 profile 的进程,再把 previous 目录移回目标名;确认新目录不完整后再删除。
具体操作可以先找目录,再改名:
ls -d "$DSH_HOME"/profiles/.rescue.staging-*/previous
# 确认里面有 package.json 与 cordis.patch.yml 后,再移回目标名
mv "$DSH_HOME/profiles/.rescue.staging-xxxx/previous" "$DSH_HOME/profiles/rescue"
移动前先把不完整的新目录改名留证,不要直接删除;否则一旦 previous 也不完整,就同时失去两份。
DeepSeek Harness:不适合的场景与替代做法
如果你的目标是“保留配置升级”,这个参数是错的工具。 三种替代:(来源)
- 只更新组合包列表 — 编辑 profile manifest 的
dsh.profile.bundles,再重启。预期:保留依赖与 patch。 - 重装指定插件 — 用
dsh plugin --profile <name> add/update。预期:只动插件,不动整棵配置。 - 清空单个 patch 文件 — 只删或重写
cordis.patch.yml。预期:保留已安装依赖。
真正需要重建时,也建议先备份整个 profile 目录。官方虽然提供了 previous 恢复,但它只覆盖替换失败,不覆盖“你重建后才发现忘了备份配置”的情况。
DeepSeek Harness 常见问题
Q:重建后为什么插件列表是空的? 因为新 manifest 依赖为空,只保留模板的组合包。插件要重新安装,装完再重启。
Q:能不能对 web 直接用这个参数?
不能。目标名称不能是任何随附 profile 名;要重建 web,应使用自定义名字加模板,例如 dsh web2 --from-default-profile web。
Q:重建成功但启动失败,会自动回到旧 profile 吗? 不会。替换先提交,启动后失败仍保留新 profile;需要手动用 previous 目录恢复。
一句话收束: --from-default-profile 是“按模板重造”,不是“按模板升级”;用它之前先备份,确认你要的是清空重来,而不是保留配置往前修。
常见问题
DeepSeek Harness 里,它是用随附模板替换目标 profile,属于重建而不是原地升级。新 profile 只保留模板当前的组合包列表,原有依赖和用户 patch 都会被删除;启动前会先在暂存目录组装,再移动到目标位置。
DeepSeek Harness 里,目标名称不能是 web、headless、sdk、sdk-minimal、acp 这些随附 profile 的任何大小写形式。该参数用于自定义目标,例如 dsh rescue --from-default-profile web,把 rescue 这个自定义 profile 按 web 模板重建。
DeepSeek Harness 里,移动失败时启动器会尝试恢复原目录;如果恢复也失败,或进程在两次重命名之间停止,原目录会保留在 $DSH_HOME/profiles/.<name>.staging-*/previous,供手动恢复。
DeepSeek Harness 里,正常。新 profile 的依赖为空、用户 patch 为空,只写入模板当前的组合包列表。插件需要重新安装,配置需要重新写;内置组合包仍从当前 dsh 安装目录解析。
DeepSeek Harness 里,不会。替换在组合包解析和应用启动之前提交,因此后续失败仍会把新 profile 留在磁盘上。启动失败要按新 profile 排查,不能用它自动回滚。
相关术语
- --from-default-profile
- --from-default-profile 是 dsh 启动参数,用于在启动前用五个随附模板之一的全新副本替换一个自定义 profile,目标目录中的依赖与用户 patch 会被删除。— DeepSeek Harness 官方参考 - dsh CLI 行为
- 暂存目录
- 暂存目录是启动器在目标 profile 旁边创建的组装位置,用于先写入完整新 profile 再移动到目标;失败时原目录可能保留在 .staging-*/previous。— DeepSeek Harness 官方参考 - dsh CLI 行为
- dsh.profile.bundles
- dsh.profile.bundles 是 Profile manifest 中按顺序列出组合包的字段;用模板重建时,新 manifest 只写入模板当前的组合包列表,不复制旧依赖。— DeepSeek Harness 官方参考 - dsh CLI 行为
- dsh rescue
- dsh rescue 是官方示例里的自定义 profile 名称,常与 --from-default-profile web 搭配,用来按 web 模板重建一个可启动的救援 profile。— DeepSeek Harness 官方参考 - dsh CLI 行为
来源
- DeepSeek Harness 官方参考 - dsh CLI 行为· deepseek-ai
- DeepSeek Harness 官方参考 - 插件配置目录· deepseek-ai