严格配置验证(仅 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 doctoropenclaw logsopenclaw healthopenclaw helpopenclaw statusopenclaw 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 写入修正后的配置