嚴格設定驗證(僅透過 doctor 遷移)
目標
- 全面拒絕未知設定鍵(根層 + 巢狀),但根層
$schema中繼資料除外。 - 拒絕沒有 schema 的外掛設定;不載入該外掛。
- 移除載入時的舊有自動遷移;遷移僅透過 doctor 執行。
- 啟動時自動執行 doctor(dry-run);若無效則阻擋非診斷指令。
非目標
- 載入時的向後相容性(舊有鍵不自動遷移)。
- 靜默丟棄未識別的鍵。
嚴格驗證規則
- 設定必須在每個層級精確匹配 schema。
- 未知鍵為驗證錯誤(根層和巢狀皆不通過),但根層的
$schema為字串時除外。 plugins.entries.<id>.config必須由外掛的 schema 驗證。- 若外掛缺少 schema,拒絕載入外掛並呈現清楚的錯誤。
- 除非外掛 manifest 宣告了頻道 id,否則未知的
channels.<id>鍵為錯誤。 - 所有外掛都需要外掛 manifest(
openclaw.plugin.json)。
外掛 schema 強制
- 每個外掛為其設定提供嚴格的 JSON Schema(內嵌在 manifest 中)。
- 外掛載入流程:
- 解析外掛 manifest + schema(
openclaw.plugin.json)。 - 依 schema 驗證設定。
- 若缺少 schema 或設定無效:阻擋外掛載入,記錄錯誤。
- 解析外掛 manifest + schema(
- 錯誤訊息包含:
- 外掛 id
- 原因(缺少 schema / 設定無效)
- 驗證失敗的路徑
- 停用的外掛保留其設定,但 Doctor + 日誌呈現警告。
Doctor 流程
- Doctor 在每次載入設定時都執行(預設為 dry-run)。
- 若設定無效:
- 印出摘要 + 可操作的錯誤。
- 指示:
openclaw doctor --fix。
openclaw doctor --fix:- 套用遷移。
- 移除未知鍵。
- 寫入更新的設定。
指令閘門(設定無效時)
允許(僅限診斷):
openclaw doctoropenclaw logsopenclaw healthopenclaw helpopenclaw statusopenclaw gateway status
其他一切必須硬失敗:「Config invalid. Run openclaw doctor --fix.」
錯誤 UX 格式
- 單一摘要標頭。
- 分組區段:
- 未知鍵(完整路徑)
- 舊有鍵 / 需要遷移
- 外掛載入失敗(外掛 id + 原因 + 路徑)
實作接觸點
src/config/zod-schema.ts:移除根層 passthrough;全面嚴格物件。src/config/zod-schema.providers.ts:確保嚴格的頻道 schema。src/config/validation.ts:對未知鍵失敗;不套用舊有遷移。src/config/io.ts:移除舊有自動遷移;一律執行 doctor dry-run。src/config/legacy*.ts:將使用移至僅限 doctor。src/plugins/*:新增 schema 登錄檔 + 閘門。src/cli中的 CLI 指令閘門。
測試
- 未知鍵拒絕(根層 + 巢狀)。
- 外掛缺少 schema -> 外掛載入被阻擋並有清楚錯誤。
- 設定無效 -> gateway 啟動被阻擋,但診斷指令除外。
- Doctor dry-run 自動執行;
doctor --fix寫入修正後的設定。