严格配置验证(仅 doctor 迁移)
目标
- 到处(根 + 嵌套)拒绝未知配置 key,除了根层的
$schema元数据。 - 拒绝没有 schema 的插件配置;不加载该插件。
- 移除加载时的遗留自动迁移;迁移只通过 doctor 运行。
- 启动时自动运行 doctor(dry-run);如果无效,阻塞非诊断命令。
严格验证规则
- 配置必须在每一层精确匹配 schema。未知 key 是验证错误(根和嵌套都不透传),除了根层的
$schema(当它是字符串时)。 plugins.entries.<id>.config必须由插件的 schema 验证。缺少 schema 则拒绝插件加载,呈现清晰错误。- 未知的
channels.<id>key 是错误,除非插件 manifest 声明了该频道 id。 - 所有插件需要插件 manifest(
openclaw.plugin.json)。
Doctor 流程
- Doctor 每次加载配置时运行(默认 dry-run)。
- 配置无效时:打印摘要 + 可操作错误,提示
openclaw doctor --fix。 openclaw doctor --fix:应用迁移、移除未知 key、写入更新后的配置。
命令门控(配置无效时)
只允许诊断命令:openclaw doctor、openclaw logs、openclaw health、openclaw help、openclaw status、openclaw gateway status。其他都硬失败并提示运行 openclaw doctor --fix。
实现接触点
src/config/zod-schema.ts:移除根 passthrough;到处严格对象。src/config/validation.ts:未知 key 失败;不应用遗留迁移。src/config/io.ts:移除遗留自动迁移;总是运行 doctor dry-run。src/plugins/*:添加 schema 注册表 + 门控。- CLI 命令门控在
src/cli。
测试
- 未知 key 拒绝(根 + 嵌套)
- 插件缺少 schema -> 插件加载被阻止并有清晰错误
- 无效配置 -> gateway 启动被阻止(诊断命令除外)
- Doctor dry-run 自动;
doctor --fix写入修正后的配置