fix(cli): stop loading .opencode config directories

This commit is contained in:
marius-kilocode
2026-06-24 17:01:32 +02:00
parent 117a0d6233
commit ef9b1dcec0
42 changed files with 245 additions and 203 deletions
@@ -51,7 +51,7 @@ describe("plugin.auth-override", () => {
Effect.gen(function* () {
const tmp = yield* TestInstance
const fs = yield* AppFileSystem.Service
const pluginDir = path.join(tmp.directory, ".opencode", "plugin")
const pluginDir = path.join(tmp.directory, ".kilo", "plugin") // kilocode_change
yield* fs.writeWithDirs(
path.join(pluginDir, "custom-copilot-auth.ts"),
@@ -82,7 +82,7 @@ describe("plugin.install.concurrent", () => {
expect(out.map((x) => x.code)).toEqual(Array.from({ length: all.length }, () => 0))
expect(out.map((x) => x.stderr.toString()).filter(Boolean)).toEqual([])
const cfg = await read(path.join(tmp.path, ".opencode", "opencode.jsonc"))
const cfg = await read(path.join(tmp.path, ".kilo", "opencode.jsonc")) // kilocode_change
expectPlugins(cfg.plugin, all)
}, 25_000)
@@ -105,8 +105,10 @@ describe("plugin.install.concurrent", () => {
expect(out.map((x) => x.code)).toEqual(Array.from({ length: all.length }, () => 0))
expect(out.map((x) => x.stderr.toString()).filter(Boolean)).toEqual([])
const server = await read(path.join(tmp.path, ".opencode", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".opencode", "tui.jsonc"))
// kilocode_change start
const server = await read(path.join(tmp.path, ".kilo", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".kilo", "tui.jsonc"))
// kilocode_change end
expectPlugins(server.plugin, all)
expectPlugins(tui.plugin, all)
}, 25_000)
@@ -114,7 +116,7 @@ describe("plugin.install.concurrent", () => {
test("preserves updates when existing config uses .json", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.json")
const cfg = path.join(tmp.path, ".kilo", "opencode.json") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(cfg, JSON.stringify({ plugin: ["seed@1.0.0"] }, null, 2))
@@ -135,6 +137,6 @@ describe("plugin.install.concurrent", () => {
const json = await read(cfg)
expectPlugins(json.plugin, ["seed@1.0.0", ...next])
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false) // kilocode_change
}, 25_000)
})
+46 -30
View File
@@ -122,8 +122,10 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(true)
const server = await read(path.join(tmp.path, ".opencode", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".opencode", "tui.jsonc"))
// kilocode_change start
const server = await read(path.join(tmp.path, ".kilo", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".kilo", "tui.jsonc"))
// kilocode_change end
expect(server.plugin).toEqual(["acme@1.2.3"])
expect(tui.plugin).toEqual(["acme@1.2.3"])
})
@@ -144,8 +146,10 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(true)
const server = await read(path.join(tmp.path, ".opencode", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".opencode", "tui.jsonc"))
// kilocode_change start
const server = await read(path.join(tmp.path, ".kilo", "opencode.jsonc"))
const tui = await read(path.join(tmp.path, ".kilo", "tui.jsonc"))
// kilocode_change end
expect(server.plugin).toEqual([["acme@1.2.3", { custom: true, other: false }]])
expect(tui.plugin).toEqual([["acme@1.2.3", { compact: true }]])
})
@@ -153,7 +157,7 @@ describe("plugin.install.task", () => {
test("preserves JSONC comments when adding plugins to server and tui config", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server", "tui"])
const cfg = path.join(tmp.path, ".opencode")
const cfg = path.join(tmp.path, ".kilo") // kilocode_change
const server = path.join(cfg, "opencode.jsonc")
const tui = path.join(cfg, "tui.jsonc")
await fs.mkdir(cfg, { recursive: true })
@@ -212,7 +216,7 @@ describe("plugin.install.task", () => {
test("preserves JSONC comments when force replacing plugin version", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.jsonc")
const cfg = path.join(tmp.path, ".kilo", "opencode.jsonc") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(
cfg,
@@ -257,14 +261,14 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(true)
const server = await read(path.join(tmp.path, ".opencode", "opencode.jsonc"))
const server = await read(path.join(tmp.path, ".kilo", "opencode.jsonc")) // kilocode_change
expect(server.plugin).toEqual(["acme@1.2.3"])
})
test("does not change configured package version without force", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.json")
const cfg = path.join(tmp.path, ".kilo", "opencode.json") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(cfg, JSON.stringify({ plugin: ["acme@1.0.0"] }, null, 2))
@@ -284,7 +288,7 @@ describe("plugin.install.task", () => {
test("does not change scoped package version without force", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.json")
const cfg = path.join(tmp.path, ".kilo", "opencode.json") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(cfg, JSON.stringify({ plugin: ["@scope/acme@1.0.0"] }, null, 2))
@@ -304,7 +308,7 @@ describe("plugin.install.task", () => {
test("keeps file plugin entries and still adds npm plugin", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.json")
const cfg = path.join(tmp.path, ".kilo", "opencode.json") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(cfg, JSON.stringify({ plugin: ["file:///tmp/acme.ts"] }, null, 2))
@@ -324,7 +328,7 @@ describe("plugin.install.task", () => {
test("force replaces configured package version and keeps tuple options", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.json")
const cfg = path.join(tmp.path, ".kilo", "opencode.json") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
await Bun.write(
cfg,
@@ -367,7 +371,7 @@ describe("plugin.install.task", () => {
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(global, "opencode.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false) // kilocode_change
})
test("writes local scope under directory when vcs is not git", async () => {
@@ -386,8 +390,10 @@ describe("plugin.install.task", () => {
const ok = await run(ctxDir(directory, worktree))
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(directory, ".opencode", "opencode.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(worktree, ".opencode", "opencode.jsonc"))).toBe(false)
// kilocode_change start
expect(await Filesystem.exists(path.join(directory, ".kilo", "opencode.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(worktree, ".kilo", "opencode.jsonc"))).toBe(false)
// kilocode_change end
})
test("writes local scope under directory when worktree is root slash", async () => {
@@ -404,7 +410,7 @@ describe("plugin.install.task", () => {
const ok = await run(ctxRoot(directory))
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(directory, ".opencode", "opencode.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(directory, ".kilo", "opencode.jsonc"))).toBe(true) // kilocode_change
})
test("writes tui local scope under directory when worktree is root slash", async () => {
@@ -421,7 +427,7 @@ describe("plugin.install.task", () => {
const ok = await run(ctxRoot(directory))
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(directory, ".opencode", "tui.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(directory, ".kilo", "tui.jsonc"))).toBe(true) // kilocode_change
})
test("writes only tui config for tui-only plugins", async () => {
@@ -436,8 +442,10 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "tui.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
// kilocode_change start
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "tui.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false)
// kilocode_change end
})
test("writes tui config for oc-themes-only packages", async () => {
@@ -454,10 +462,12 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "tui.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
// kilocode_change start
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "tui.jsonc"))).toBe(true)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false)
// kilocode_change end
const tui = await read(path.join(tmp.path, ".opencode", "tui.jsonc"))
const tui = await read(path.join(tmp.path, ".kilo", "tui.jsonc")) // kilocode_change
expect(tui.plugin).toEqual(["acme@1.2.3"])
})
@@ -473,15 +483,19 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "tui.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
// kilocode_change start
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "tui.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false)
// kilocode_change end
})
test("force replaces version in both server and tui configs", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server", "tui"])
const server = path.join(tmp.path, ".opencode", "opencode.json")
const tui = path.join(tmp.path, ".opencode", "tui.json")
// kilocode_change start
const server = path.join(tmp.path, ".kilo", "opencode.json")
const tui = path.join(tmp.path, ".kilo", "tui.json")
// kilocode_change end
await fs.mkdir(path.dirname(server), { recursive: true })
await Bun.write(server, JSON.stringify({ plugin: ["acme@1.0.0", "other@1.0.0"] }, null, 2))
await Bun.write(tui, JSON.stringify({ plugin: [["acme@1.0.0", { mode: "safe" }], "other@1.0.0"] }, null, 2))
@@ -505,7 +519,7 @@ describe("plugin.install.task", () => {
test("returns false and keeps config unchanged for invalid JSONC", async () => {
await using tmp = await tmpdir()
const target = await plugin(tmp.path, ["server"])
const cfg = path.join(tmp.path, ".opencode", "opencode.jsonc")
const cfg = path.join(tmp.path, ".kilo", "opencode.jsonc") // kilocode_change
await fs.mkdir(path.dirname(cfg), { recursive: true })
const bad = '{"plugin": ["acme@1.0.0",}'
await Bun.write(cfg, bad)
@@ -534,8 +548,10 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "tui.jsonc"))).toBe(false)
// kilocode_change start
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "tui.jsonc"))).toBe(false)
// kilocode_change end
})
test("returns false when manifest cannot be read", async () => {
@@ -551,7 +567,7 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false) // kilocode_change
})
test("returns false when install fails", async () => {
@@ -565,6 +581,6 @@ describe("plugin.install.task", () => {
const ok = await run(ctx(tmp.path))
expect(ok).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".opencode", "opencode.jsonc"))).toBe(false)
expect(await Filesystem.exists(path.join(tmp.path, ".kilo", "opencode.jsonc"))).toBe(false) // kilocode_change
})
})