Add OpenClaw config directory settings (#1518)

Co-authored-by: 张斌 <zhangbin25@xiaomi.com>
This commit is contained in:
Franklin
2026-04-20 08:44:38 +08:00
committed by GitHub
parent 8ba92b5470
commit 34349a2743
11 changed files with 124 additions and 12 deletions
+28 -1
View File
@@ -68,7 +68,8 @@ describe("useDirectorySettings", () => {
if (app === "claude") return "/remote/claude";
if (app === "codex") return "/remote/codex";
if (app === "gemini") return "/remote/gemini";
return "/remote/opencode";
if (app === "opencode") return "/remote/opencode";
return "/remote/openclaw";
});
selectConfigDirectoryMock.mockReset();
});
@@ -89,6 +90,7 @@ describe("useDirectorySettings", () => {
codex: "/remote/codex",
gemini: "/remote/gemini",
opencode: "/remote/opencode",
openclaw: "/remote/openclaw",
});
});
@@ -211,6 +213,29 @@ describe("useDirectorySettings", () => {
expect(result.current.resolvedDirs.appConfig).toBe("/home/mock/.cc-switch");
});
it("updates openclaw directory when browsing succeeds", async () => {
selectConfigDirectoryMock.mockResolvedValue("/picked/openclaw");
const { result } = renderHook(() =>
useDirectorySettings({
settings: createSettings({ openclawConfigDir: undefined }),
onUpdateSettings,
}),
);
await waitFor(() => expect(result.current.isLoading).toBe(false));
await act(async () => {
await result.current.browseDirectory("openclaw");
});
expect(selectConfigDirectoryMock).toHaveBeenCalledWith("/remote/openclaw");
expect(onUpdateSettings).toHaveBeenCalledWith({
openclawConfigDir: "/picked/openclaw",
});
expect(result.current.resolvedDirs.openclaw).toBe("/picked/openclaw");
});
it("resetAllDirectories applies provided resolved values", async () => {
const { result } = renderHook(() =>
useDirectorySettings({ settings: createSettings(), onUpdateSettings }),
@@ -223,6 +248,7 @@ describe("useDirectorySettings", () => {
"/server/codex",
"/server/gemini",
"/server/opencode",
"/server/openclaw",
);
});
@@ -230,5 +256,6 @@ describe("useDirectorySettings", () => {
expect(result.current.resolvedDirs.codex).toBe("/server/codex");
expect(result.current.resolvedDirs.gemini).toBe("/server/gemini");
expect(result.current.resolvedDirs.opencode).toBe("/server/opencode");
expect(result.current.resolvedDirs.openclaw).toBe("/server/openclaw");
});
});
+17 -2
View File
@@ -72,6 +72,9 @@ const createSettingsFormMock = (overrides: Record<string, unknown> = {}) => ({
skipClaudeOnboarding: true,
claudeConfigDir: "/claude",
codexConfigDir: "/codex",
geminiConfigDir: "/gemini",
opencodeConfigDir: "/opencode",
openclawConfigDir: "/openclaw",
language: "zh",
},
isLoading: false,
@@ -90,6 +93,9 @@ const createDirectorySettingsMock = (
appConfig: "/home/mock/.cc-switch",
claude: "/default/claude",
codex: "/default/codex",
gemini: "/default/gemini",
opencode: "/default/opencode",
openclaw: "/default/openclaw",
},
isLoading: false,
initialAppConfigDir: undefined,
@@ -132,6 +138,9 @@ describe("useSettings hook", () => {
skipClaudeOnboarding: true,
claudeConfigDir: "/server/claude",
codexConfigDir: "/server/codex",
geminiConfigDir: "/server/gemini",
opencodeConfigDir: "/server/opencode",
openclawConfigDir: "/server/openclaw",
language: "zh",
};
@@ -218,6 +227,9 @@ describe("useSettings hook", () => {
enableClaudePluginIntegration: false,
claudeConfigDir: "/server/claude",
codexConfigDir: undefined,
geminiConfigDir: "/server/gemini",
opencodeConfigDir: "/server/opencode",
openclawConfigDir: "/server/openclaw",
language: "en",
};
useSettingsQueryMock.mockReturnValue({
@@ -230,6 +242,7 @@ describe("useSettings hook", () => {
...serverSettings,
claudeConfigDir: " /custom/claude ",
codexConfigDir: " ",
openclawConfigDir: " /custom/openclaw ",
language: "en",
enableClaudePluginIntegration: true, // 状态从 false 变为 true
},
@@ -253,6 +266,7 @@ describe("useSettings hook", () => {
const payload = mutateAsyncMock.mock.calls[0][0] as Settings;
expect(payload.claudeConfigDir).toBe("/custom/claude");
expect(payload.codexConfigDir).toBeUndefined();
expect(payload.openclawConfigDir).toBe("/custom/openclaw");
expect(payload.language).toBe("en");
expect(setAppConfigDirOverrideMock).toHaveBeenCalledWith("/override/app");
// 状态改变,应该调用 API
@@ -380,8 +394,9 @@ describe("useSettings hook", () => {
expect(directorySettingsMock.resetAllDirectories).toHaveBeenCalledWith(
"/server/claude",
undefined,
undefined, // geminiConfigDir
undefined, // opencodeConfigDir
"/server/gemini",
"/server/opencode",
"/server/openclaw",
);
expect(metadataMock.setRequiresRestart).toHaveBeenCalledWith(false);
});