| name | dsh-local-verify |
| description | 要在真实 DeepSeek Harness 安装上读取、安装、启动或验证插件时使用——任何会碰 $DSH_HOME / ~/.dsh、profile、dump-config、tarball 安装、Web UI、Session 日志或回滚的操作都先用它。保护凭据、settings 写者锁、用户 patch、真实会话与持久数据;按只读配置检查→隔离 overlay→tarball→启动的代价顺序验证,并在结束时报告所有环境改动。 |
在真实 dsh 环境验证插件
Harness home 是用户正在使用的状态,不是测试夹具。默认路径是 ~/.dsh,设置了
$DSH_HOME 时以该值为准。开始前确认目标 profile、dsh 版本和任务是否真的授权写入;
只要求分析时保持只读。
不可越过的边界
| 内容 | 规则 |
|---|
| 凭据文件、API key、cookie | 不读取、不打印、不复制、不提交;只使用受支持的引用机制 |
| settings | 不直接写;它可能由带跨进程锁的服务拥有,改动走产品 UI/API |
| Session 日志和附件 | 默认不读内容;诊断优先用合成 fixture 或用户明确指定的副本 |
| storage / 数据库 | 不手改;用拥有该数据的服务或迁移工具 |
profile package.json / lockfile | 安装会改,操作前后都要记录 diff 并准备回滚 |
| profile/home patch | 只改本任务拥有的行;不碰其他工具标记的 managed 段 |
| 第三方插件安装脚本 | 进程内本机权限执行;只对审阅并锁 commit 的代码授权 |
列 profile 名可以,读取私密内容不可以:
find "${DSH_HOME:-$HOME/.dsh}/profiles" -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
从低代价到高代价
- 版本与静态门禁:
python3 tools/check-harness-drift.py,再跑插件自己的门禁。
- 配置转储:
dsh --profile <profile> --dump-config,不启动 Agent。
- 隔离 overlay:用临时 patch 和绝对插件路径,不安装包。
- tarball 安装:对临时/测试 profile 先做,验证真实发布内容。
- Web 或 headless 启动:最后才启动,确认端口、进程和外部服务影响。
不要为了“更真实”直接跳到用户主 profile。
Overlay 回路
临时 patch 只放本次插件行,路径使用绝对路径。不要把临时文件放进真实 Harness home。
- insert:
- id: my-plugin
name: '/absolute/path/to/dsh-my-plugin/src/index.ts'
config: {}
dsh --profile <profile> --dump-config --patch /absolute/path/to/overlay.yml
dsh web --profile <profile> --patch /absolute/path/to/overlay.yml
具体 CLI 参数以目标版本 --help 为准;preview 之间若命令形状变化,不猜。
Tarball 回路
python3 tools/check-plugin.py dsh-my-plugin
cd dsh-my-plugin
pnpm pack
dsh plugin --profile <test-profile> add ./<package>-<version>.tgz
dsh --profile <test-profile> --dump-config
核对 tarball 的 files、入口、patch 和版本,不能用工作区 src/ 能跑来代替发布产物
验证。安装后从目标 profile 的 lockfile 判断实际解析的是 tarball、registry 版本还是
link:;不要凭本地目录版本号推断。
启动前
- 确认目标端口未被现有进程占用;发现已有 Harness 时先停下并请求用户决定是否复用或
停止,不能擅自杀掉。
- 明确是否会调用外部模型、网络、MCP 或插件服务;本地优先不代表组合中的外部服务不
上传数据。
- 如果验证会写 Session 或 storage,使用测试工作目录、测试 profile 和无敏感内容的
prompt。
回滚
优先使用目标环境已经安装并验证过的 snapshot/restore 工具;没有时,至少在安装前保留
profile manifest、lockfile 和 patch 的受限权限备份,并记录恢复命令。不要备份凭据和
Session 到工作区。
标准卸载路径:
dsh plugin --profile <profile> remove <package>
dsh --profile <profile> --dump-config
若改动期间 package 版本、bundle 层或上游 dsh 同时漂移,停止自动恢复:混合状态需要
人工核对,不能假装把旧 manifest 写回就恢复了原树。
收尾报告
明确列出:验证的 dsh/插件版本、使用的 profile、修改了哪些文件、是否仍有进程、是否
调用了外部服务、回滚点在哪里、哪些检查通过/失败/跳过。失败现场不要静默清理成看似
成功;真实会话内容、凭据值和私人路径不要出现在报告里。