From 8c53e42d29b234c6e11d81bb7de717d5c0161d42 Mon Sep 17 00:00:00 2001 From: Saba tchikhinashvili Date: Thu, 5 Feb 2026 22:08:56 +0100 Subject: [PATCH] fix: PATCH /config writes to correct project config file Config.update() was writing to config.json which is never read by the config loader. Now writes to opencode.jsonc or opencode.json (whichever exists), matching the files the loader actually reads. Mirrors the existing globalConfigFile() pattern. Fixes #4194 Fixes #6984 --- packages/opencode/src/config/config.ts | 12 +++++++++++- packages/opencode/test/config/config.test.ts | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index ed1b155003da..39ddde426c07 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -1355,12 +1355,22 @@ export namespace Config { } export async function update(config: Info) { - const filepath = path.join(Instance.directory, "config.json") + const filepath = projectConfigFile() const existing = await loadFile(filepath) await Bun.write(filepath, JSON.stringify(mergeDeep(existing, config), null, 2)) await Instance.dispose() } + function projectConfigFile() { + const candidates = ["opencode.jsonc", "opencode.json"].map((file) => + path.join(Instance.directory, file), + ) + for (const file of candidates) { + if (existsSync(file)) return file + } + return candidates[1] + } + function globalConfigFile() { const candidates = ["opencode.jsonc", "opencode.json", "config.json"].map((file) => path.join(Global.Path.config, file), diff --git a/packages/opencode/test/config/config.test.ts b/packages/opencode/test/config/config.test.ts index dee633110604..7e4687105903 100644 --- a/packages/opencode/test/config/config.test.ts +++ b/packages/opencode/test/config/config.test.ts @@ -549,7 +549,7 @@ test("updates config and writes to file", async () => { const newConfig = { model: "updated/model" } await Config.update(newConfig as any) - const writtenConfig = JSON.parse(await Bun.file(path.join(tmp.path, "config.json")).text()) + const writtenConfig = JSON.parse(await Bun.file(path.join(tmp.path, "opencode.json")).text()) expect(writtenConfig.model).toBe("updated/model") }, })