# 配置解析契约(U2 / R1-R2 / KD2)
本文件是 OMT 三端(DSH 插件、桌面应用、CLI/MCP)共用的配置解析**单一权威出处**。
任何一端的解析实现与本文件冲突时,以本文件为准并修复实现。
## 解析优先级
统一规则:**显式参数 > 环境变量 > 默认值**,三端一致。
环境变量为空字符串或纯空白时视为未设置(回落到下一级)。
| 变量 | 显式参数 | 环境变量 | 默认值 |
| --- | --- | --- | --- |
| runtime dir | `--runtime-dir
` | `OMT_RUNTIME_DIR` | `~/.omt/run` |
| 全局 home | `--home `(可重复) | `OMT_HOME` | `~/.omt` |
- `--home` 未提供时 daemon 仅带全局 home 启动;重复 `--home` 按顺序注册多个 home。
- runtime dir 是 daemon 专属位置:descriptor、选举锁、socket、日志都在其中
(布局见 `crates/omt-runtime/src/paths.rs` 头注释)。
## 多端同一 runtime dir 契约
所有 UI 层必须解析到与 daemon 相同的 runtime dir——客户端凭 descriptor
发现 daemon,解析不一致等于把同一个用户劈成两个互不可见的拓扑
(两个 daemon、两套 home、偏好互不同步)。因此:
- 客户端不得引入平台缓存目录等"第二事实源";
- 测试/sandbox 经 `OMT_RUNTIME_DIR` 整体重定向;
- 跨端 parity 由 `tests/config-parity.spec.ts` 锁定(R2)。
## 权威实现坐标(防漂移反向链接)
| 层 | 实现 |
| --- | --- |
| Rust(daemon + CLI 共用) | `crates/omt-runtime/src/paths.rs::resolve`(runtime dir);`server.rs` 全局 home 段 |
| TS 共享客户端 | `packages/client-ts/src/client.ts::OmtClient.resolveRuntimeDir` |
| DSH 适配层 | `src/host/service.ts`(经 `OmtClient.resolveRuntimeDir` 取 runtime dir;daemon 二进制解析见下节) |
## descriptor 增量字段不变式
descriptor.json 的 `schemaVersion === 1` 期间:
- 新增字段对两端都安全——TS reader 只硬校验 `schemaVersion === 1`
(`packages/client-ts/src/client.ts:136`),未知字段容忍;
- Rust 写端追加字段无需升版本;删除/改型字段才需要 schemaVersion 递增;
- parity 不变式由 U3 场景「descriptor 追加未知字段后 readDescriptor 仍成功」钉住。
## daemon 二进制覆盖(TS 适配层)
DSH 插件拉起 daemon 时按以下顺序取二进制(KTD7,实现在 U13):
1. 显式 `daemonPath` 选项;
2. `OMT_DAEMON` 环境变量;
3. 系统 `PATH` 查找与已知前缀探测(`~/.local/bin`、`/opt/homebrew/bin`、
`/usr/local/bin`);
4. npm 平台包 `require.resolve` 兜底。
v1 取首个命中,不做 semver 择优(deferred)。产品渠道安装
(brew / install.sh)落在第 3 级即命中,无需 npm 兜底。