fix(config): use r+ when fsyncing migrated temp file

Apply the Windows-safe open mode in migrateLegacyPluginEntry and add a regression test to assert the temp fd is opened with r+ before fsync.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-05-11 08:54:46 +09:00
parent f45452ae6c
commit 64f9a70712
2 changed files with 37 additions and 2 deletions
+1 -1
View File
@@ -54,7 +54,7 @@ export function migrateLegacyPluginEntry(configPath: string): boolean {
const tempPath = `${configPath}.tmp`
writeFileSync(tempPath, updated, "utf-8")
const tempFileDescriptor = openSync(tempPath, "r")
const tempFileDescriptor = openSync(tempPath, "r+")
try {
fsyncSync(tempFileDescriptor)
} finally {
@@ -96,6 +96,41 @@ describe("migrateLegacyPluginEntry", () => {
})
})
describe("#given migration writes a temp file for fsync", () => {
describe("#when opening the temp file descriptor", () => {
it("#then uses r+ mode to satisfy FlushFileBuffers requirements on Windows", async () => {
const configPath = join(testDir, "opencode.json")
writeFileSync(configPath, JSON.stringify({ plugin: ["oh-my-opencode@latest"] }, null, 2))
const fs = await import("node:fs")
const originalOpenSync = fs.openSync
const openSyncCalls: string[] = []
mock.module("node:fs", () => ({
...fs,
openSync: (path: Parameters<typeof fs.openSync>[0], flags: Parameters<typeof fs.openSync>[1]) => {
openSyncCalls.push(String(flags))
return originalOpenSync(path, flags)
},
}))
try {
const { migrateLegacyPluginEntry } = await importFreshMigrationModule()
const result = migrateLegacyPluginEntry(configPath)
expect(result).toBe(true)
expect(openSyncCalls).toContain("r+")
} finally {
mock.module("node:fs", () => ({
...fs,
openSync: originalOpenSync,
}))
}
})
})
})
describe("#given opencode.json contains pinned oh-my-opencode version", () => {
describe("#when migrating the config", () => {
it("#then preserves the version pin", async () => {
@@ -217,4 +252,4 @@ describe("migrateLegacyPluginEntry", () => {
})
})
})
})
})