import { describe, expect, test } from "bun:test" import { promises as fs } from "fs" import path from "path" import os from "os" import { writeOpenCodeBundle } from "../src/targets/opencode" import type { OpenCodeBundle } from "../src/types/opencode" async function exists(filePath: string): Promise { try { await fs.access(filePath) return true } catch { return false } } describe("writeOpenCodeBundle", () => { test("writes config, agents, plugins, and skills", async () => { const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-test-")) const bundle: OpenCodeBundle = { config: { $schema: "https://opencode.ai/config.json" }, agents: [{ name: "agent-one", content: "Agent content" }], plugins: [{ name: "hook.ts", content: "export {}" }], skillDirs: [ { name: "skill-one", sourceDir: path.join(import.meta.dir, "fixtures", "sample-plugin", "skills", "skill-one"), }, ], } await writeOpenCodeBundle(tempRoot, bundle) expect(await exists(path.join(tempRoot, "opencode.json"))).toBe(true) expect(await exists(path.join(tempRoot, ".opencode", "agents", "agent-one.md"))).toBe(true) expect(await exists(path.join(tempRoot, ".opencode", "plugins", "hook.ts"))).toBe(true) expect(await exists(path.join(tempRoot, ".opencode", "skills", "skill-one", "SKILL.md"))).toBe(true) }) test("writes directly into a .opencode output root", async () => { const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "opencode-root-")) const outputRoot = path.join(tempRoot, ".opencode") const bundle: OpenCodeBundle = { config: { $schema: "https://opencode.ai/config.json" }, agents: [{ name: "agent-one", content: "Agent content" }], plugins: [], skillDirs: [ { name: "skill-one", sourceDir: path.join(import.meta.dir, "fixtures", "sample-plugin", "skills", "skill-one"), }, ], } await writeOpenCodeBundle(outputRoot, bundle) expect(await exists(path.join(outputRoot, "opencode.json"))).toBe(true) expect(await exists(path.join(outputRoot, "agents", "agent-one.md"))).toBe(true) expect(await exists(path.join(outputRoot, "skills", "skill-one", "SKILL.md"))).toBe(true) expect(await exists(path.join(outputRoot, ".opencode"))).toBe(false) }) test("writes directly into ~/.config/opencode style output root", async () => { // Simulates the global install path: ~/.config/opencode const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "config-opencode-")) const outputRoot = path.join(tempRoot, ".config", "opencode") const bundle: OpenCodeBundle = { config: { $schema: "https://opencode.ai/config.json" }, agents: [{ name: "agent-one", content: "Agent content" }], plugins: [], skillDirs: [ { name: "skill-one", sourceDir: path.join(import.meta.dir, "fixtures", "sample-plugin", "skills", "skill-one"), }, ], } await writeOpenCodeBundle(outputRoot, bundle) // Should write directly, not nested under .opencode expect(await exists(path.join(outputRoot, "opencode.json"))).toBe(true) expect(await exists(path.join(outputRoot, "agents", "agent-one.md"))).toBe(true) expect(await exists(path.join(outputRoot, "skills", "skill-one", "SKILL.md"))).toBe(true) expect(await exists(path.join(outputRoot, ".opencode"))).toBe(false) }) })