diff --git a/src/cli/config-manager/write-omo-config.test.ts b/src/cli/config-manager/write-omo-config.test.ts index 48ae5c620..10ccf7a27 100644 --- a/src/cli/config-manager/write-omo-config.test.ts +++ b/src/cli/config-manager/write-omo-config.test.ts @@ -4,6 +4,7 @@ import { tmpdir } from "node:os" import { join } from "node:path" import { parseJsonc } from "../../shared/jsonc-parser" +import { CONFIG_BASENAME, LEGACY_CONFIG_BASENAME } from "../../shared/plugin-identity" import type { InstallConfig } from "../types" import { resetConfigContext } from "./config-context" import { generateOmoConfig } from "./generate-omo-config" @@ -35,7 +36,7 @@ describe("writeOmoConfig", () => { beforeEach(() => { testConfigDir = join(tmpdir(), `omo-write-config-${Date.now()}-${Math.random().toString(36).slice(2)}`) - testConfigPath = join(testConfigDir, "oh-my-opencode.json") + testConfigPath = join(testConfigDir, `${CONFIG_BASENAME}.json`) mkdirSync(testConfigDir, { recursive: true }) process.env.OPENCODE_CONFIG_DIR = testConfigDir @@ -78,4 +79,21 @@ describe("writeOmoConfig", () => { expect(savedConfig).toHaveProperty(defaultKey) } }) + + it("migrates a legacy config file to the canonical basename before writing", () => { + // given + const legacyConfigPath = join(testConfigDir, `${LEGACY_CONFIG_BASENAME}.json`) + const canonicalConfigPath = join(testConfigDir, `${CONFIG_BASENAME}.json`) + writeFileSync(legacyConfigPath, JSON.stringify({ disabled_hooks: ["comment-checker"] }, null, 2) + "\n", "utf-8") + + // when + const result = writeOmoConfig(installConfig) + + // then + expect(result.success).toBe(true) + expect(result.configPath).toEndWith(canonicalConfigPath) + + const savedConfig = parseJsonc>(readFileSync(canonicalConfigPath, "utf-8")) + expect(savedConfig.disabled_hooks).toEqual(["comment-checker"]) + }) }) diff --git a/src/cli/config-manager/write-omo-config.ts b/src/cli/config-manager/write-omo-config.ts index 697322584..d9bf1a169 100644 --- a/src/cli/config-manager/write-omo-config.ts +++ b/src/cli/config-manager/write-omo-config.ts @@ -1,5 +1,9 @@ import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs" +import { basename, dirname, extname, join } from "node:path" + import { parseJsonc } from "../../shared" +import { migrateLegacyConfigFile } from "../../shared/migrate-legacy-config-file" +import { CONFIG_BASENAME, LEGACY_CONFIG_BASENAME } from "../../shared/plugin-identity" import type { ConfigMergeResult, InstallConfig } from "../types" import { backupConfigFile } from "./backup-config" import { getConfigDir, getOmoConfigPath } from "./config-context" @@ -23,7 +27,14 @@ export function writeOmoConfig(installConfig: InstallConfig): ConfigMergeResult } } - const omoConfigPath = getOmoConfigPath() + const detectedConfigPath = getOmoConfigPath() + const canonicalConfigPath = join(dirname(detectedConfigPath), `${CONFIG_BASENAME}${extname(detectedConfigPath) || ".json"}`) + const shouldMigrateLegacyPath = basename(detectedConfigPath).startsWith(LEGACY_CONFIG_BASENAME) + const omoConfigPath = shouldMigrateLegacyPath + ? ((migrateLegacyConfigFile(detectedConfigPath) || existsSync(canonicalConfigPath)) + ? canonicalConfigPath + : detectedConfigPath) + : detectedConfigPath try { const newConfig = generateOmoConfig(installConfig) @@ -71,7 +82,7 @@ export function writeOmoConfig(installConfig: InstallConfig): ConfigMergeResult return { success: false, configPath: omoConfigPath, - error: formatErrorWithSuggestion(err, "write oh-my-opencode config"), + error: formatErrorWithSuggestion(err, `write ${CONFIG_BASENAME} config`), } } }