mirror of
https://github.com/anomalyco/opencode.git
synced 2026-10-26 11:50:05 +00:00
65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { mkdir, rm } from "node:fs/promises"
|
|
import { join } from "node:path"
|
|
import { Plugin } from "@opencode/plugin"
|
|
import { initRepo } from "../../core/test/fixture/git"
|
|
import { tmpdir } from "../../core/test/fixture/tmpdir"
|
|
import { OpenCode } from "../src"
|
|
|
|
test("embedded worktree APIs use project IDs and SDK-registered strategies", async () => {
|
|
await using directory = await tmpdir("opencode-sdk-worktree-")
|
|
await initRepo(directory.path)
|
|
const state = { activated: 0, discovered: 0, removed: 0 }
|
|
const plugin = Plugin.define({
|
|
id: "sdk-worktrees",
|
|
async setup(ctx) {
|
|
state.activated++
|
|
await ctx.worktree.transform((editor) =>
|
|
editor.add({
|
|
id: "sdk-copy",
|
|
async create(input, { signal }) {
|
|
signal.throwIfAborted()
|
|
await mkdir(input.directory)
|
|
return { directory: input.directory }
|
|
},
|
|
async remove(input, { signal }) {
|
|
signal.throwIfAborted()
|
|
await rm(input.directory, { recursive: true })
|
|
state.removed++
|
|
},
|
|
async list(_source, { signal }) {
|
|
signal.throwIfAborted()
|
|
state.discovered++
|
|
return []
|
|
},
|
|
}),
|
|
)
|
|
},
|
|
})
|
|
await using opencode = await OpenCode.create({
|
|
plugins: [plugin],
|
|
config: { directory: directory.path, project: false },
|
|
models: { fetch: false },
|
|
fs: { filewatcher: false },
|
|
})
|
|
const session = await opencode.sessions.create({ location: { directory: directory.path } })
|
|
const projectID = session.projectID
|
|
expect(await opencode.worktree.list({ projectID })).toHaveLength(1)
|
|
expect(state.activated).toBe(0)
|
|
const worktree = await opencode.worktree.create({
|
|
projectID,
|
|
directory: join(directory.path, "copies"),
|
|
name: "task",
|
|
})
|
|
expect(state.activated).toBe(1)
|
|
expect(await opencode.worktree.list({ projectID })).toContainEqual({
|
|
directory: worktree.directory,
|
|
strategy: "sdk-copy",
|
|
})
|
|
expect(state.discovered).toBe(0)
|
|
await opencode.worktree.refresh({ projectID })
|
|
expect(state.discovered).toBe(1)
|
|
await opencode.worktree.remove({ projectID, directory: worktree.directory, force: false })
|
|
expect(state.removed).toBe(1)
|
|
expect(await opencode.worktree.list({ projectID })).toHaveLength(1)
|
|
})
|