





























@@ -42,6 +42,9 @@ const updateNpmInstalledPlugins = vi.fn();
4242const loadInstalledPluginIndexInstallRecords = vi.fn(
4343async (params: { config?: OpenClawConfig } = {}) => params.config?.plugins?.installs ?? {},
4444);
45+const legacyConfigRepairMocks = vi.hoisted(() => ({
46+repairLegacyConfigForUpdateChannel: vi.fn(),
47+}));
4548const nodeVersionSatisfiesEngine = vi.fn();
4649const spawn = vi.fn();
4750const { defaultRuntime: runtimeCapture, resetRuntimeCapture } = createCliRuntimeCapture();
@@ -246,6 +249,9 @@ vi.mock("./update-cli/restart-helper.js", () => ({
246249vi.mock("../commands/doctor.js", () => ({
247250doctorCommand: vi.fn(),
248251}));
252+vi.mock("../commands/doctor/legacy-config-repair.js", () => ({
253+repairLegacyConfigForUpdateChannel: legacyConfigRepairMocks.repairLegacyConfigForUpdateChannel,
254+}));
249255// Mock the daemon-cli module
250256vi.mock("./daemon-cli.js", () => ({
251257runDaemonInstall: mockedRunDaemonInstall,
@@ -579,6 +585,12 @@ describe("update-cli", () => {
579585vi.mocked(runDaemonInstall).mockResolvedValue(undefined);
580586vi.mocked(runDaemonRestart).mockResolvedValue(true);
581587vi.mocked(doctorCommand).mockResolvedValue(undefined);
588+legacyConfigRepairMocks.repairLegacyConfigForUpdateChannel.mockImplementation(
589+async (params: { configSnapshot: ConfigFileSnapshot }) => ({
590+snapshot: params.configSnapshot,
591+repaired: false,
592+}),
593+);
582594confirm.mockResolvedValue(false);
583595select.mockResolvedValue("stable");
584596vi.mocked(runGatewayUpdate).mockResolvedValue(makeOkUpdateResult());
@@ -2563,9 +2575,32 @@ describe("update-cli", () => {
25632575valid: true,
25642576hash: "migrated-hash",
25652577});
2578+legacyConfigRepairMocks.repairLegacyConfigForUpdateChannel.mockImplementationOnce(
2579+async (params: { configSnapshot: ConfigFileSnapshot; jsonMode: boolean }) => {
2580+await replaceConfigFile({
2581+nextConfig: migratedConfig,
2582+baseHash: params.configSnapshot.hash,
2583+writeOptions: {
2584+allowConfigSizeDrop: true,
2585+skipOutputLogs: params.jsonMode,
2586+},
2587+});
2588+return {
2589+snapshot: await readConfigFileSnapshot(),
2590+repaired: true,
2591+};
2592+},
2593+);
2566259425672595await updateCommand({ channel: "beta", yes: true });
256825962597+expect(legacyConfigRepairMocks.repairLegacyConfigForUpdateChannel).toHaveBeenCalledWith({
2598+configSnapshot: expect.objectContaining({
2599+hash: "legacy-hash",
2600+valid: false,
2601+}),
2602+jsonMode: false,
2603+});
25692604expect(replaceConfigFile).toHaveBeenCalledTimes(2);
25702605expect(replaceConfigFile).toHaveBeenNthCalledWith(1, {
25712606nextConfig: expect.objectContaining({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。