嚴格設定驗證(僅透過 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 中)。
  • 外掛載入流程:
    1. 解析外掛 manifest + schema(openclaw.plugin.json)。
    2. 依 schema 驗證設定。
    3. 若缺少 schema 或設定無效:阻擋外掛載入,記錄錯誤。
  • 錯誤訊息包含:
    • 外掛 id
    • 原因(缺少 schema / 設定無效)
    • 驗證失敗的路徑
  • 停用的外掛保留其設定,但 Doctor + 日誌呈現警告。

Doctor 流程

  • Doctor 在每次載入設定時都執行(預設為 dry-run)。
  • 若設定無效:
    • 印出摘要 + 可操作的錯誤。
    • 指示:openclaw doctor --fix
  • openclaw doctor --fix
    • 套用遷移。
    • 移除未知鍵。
    • 寫入更新的設定。

指令閘門(設定無效時)

允許(僅限診斷):

  • openclaw doctor
  • openclaw logs
  • openclaw health
  • openclaw help
  • openclaw status
  • openclaw 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 寫入修正後的設定。