mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-03-31 14:22:27 +00:00
147 lines
3.9 KiB
TypeScript
147 lines
3.9 KiB
TypeScript
import { test, expect } from "bun:test"
|
|
import path from "path"
|
|
import fs from "fs/promises"
|
|
import { tmpdir } from "../fixture/fixture"
|
|
import { Instance } from "../../src/project/instance"
|
|
import { Agent } from "../../src/agent/agent"
|
|
|
|
test("loads built-in agents when no custom agents configured", async () => {
|
|
await using tmp = await tmpdir()
|
|
await Instance.provide({
|
|
directory: tmp.path,
|
|
fn: async () => {
|
|
const agents = await Agent.list()
|
|
const names = agents.map((a) => a.name)
|
|
expect(names).toContain("build")
|
|
expect(names).toContain("plan")
|
|
},
|
|
})
|
|
})
|
|
|
|
test("custom subagent works alongside built-in primary agents", async () => {
|
|
await using tmp = await tmpdir({
|
|
init: async (dir) => {
|
|
const opencodeDir = path.join(dir, ".opencode")
|
|
await fs.mkdir(opencodeDir, { recursive: true })
|
|
const agentDir = path.join(opencodeDir, "agent")
|
|
await fs.mkdir(agentDir, { recursive: true })
|
|
|
|
await Bun.write(
|
|
path.join(agentDir, "helper.md"),
|
|
`---
|
|
model: test/model
|
|
mode: subagent
|
|
---
|
|
Helper subagent prompt`,
|
|
)
|
|
},
|
|
})
|
|
await Instance.provide({
|
|
directory: tmp.path,
|
|
fn: async () => {
|
|
const agents = await Agent.list()
|
|
const helper = agents.find((a) => a.name === "helper")
|
|
expect(helper).toBeDefined()
|
|
expect(helper?.mode).toBe("subagent")
|
|
|
|
// Built-in primary agents should still exist
|
|
const build = agents.find((a) => a.name === "build")
|
|
expect(build).toBeDefined()
|
|
expect(build?.mode).toBe("primary")
|
|
},
|
|
})
|
|
})
|
|
|
|
test("throws error when all primary agents are disabled", async () => {
|
|
await using tmp = await tmpdir({
|
|
init: async (dir) => {
|
|
await Bun.write(
|
|
path.join(dir, "opencode.json"),
|
|
JSON.stringify({
|
|
$schema: "https://opencode.ai/config.json",
|
|
agent: {
|
|
build: { disable: true },
|
|
plan: { disable: true },
|
|
},
|
|
}),
|
|
)
|
|
},
|
|
})
|
|
await Instance.provide({
|
|
directory: tmp.path,
|
|
fn: async () => {
|
|
try {
|
|
await Agent.list()
|
|
expect(true).toBe(false) // should not reach here
|
|
} catch (e: any) {
|
|
expect(e.data?.message).toContain("No primary agents are available")
|
|
}
|
|
},
|
|
})
|
|
})
|
|
|
|
test("does not throw when at least one primary agent remains", async () => {
|
|
await using tmp = await tmpdir({
|
|
init: async (dir) => {
|
|
await Bun.write(
|
|
path.join(dir, "opencode.json"),
|
|
JSON.stringify({
|
|
$schema: "https://opencode.ai/config.json",
|
|
agent: {
|
|
build: { disable: true },
|
|
},
|
|
}),
|
|
)
|
|
},
|
|
})
|
|
await Instance.provide({
|
|
directory: tmp.path,
|
|
fn: async () => {
|
|
const agents = await Agent.list()
|
|
const plan = agents.find((a) => a.name === "plan")
|
|
expect(plan).toBeDefined()
|
|
expect(plan?.mode).toBe("primary")
|
|
},
|
|
})
|
|
})
|
|
|
|
test("custom primary agent satisfies requirement when built-ins disabled", async () => {
|
|
await using tmp = await tmpdir({
|
|
init: async (dir) => {
|
|
const opencodeDir = path.join(dir, ".opencode")
|
|
await fs.mkdir(opencodeDir, { recursive: true })
|
|
const agentDir = path.join(opencodeDir, "agent")
|
|
await fs.mkdir(agentDir, { recursive: true })
|
|
|
|
await Bun.write(
|
|
path.join(agentDir, "custom.md"),
|
|
`---
|
|
model: test/model
|
|
mode: primary
|
|
---
|
|
Custom primary agent`,
|
|
)
|
|
|
|
await Bun.write(
|
|
path.join(dir, "opencode.json"),
|
|
JSON.stringify({
|
|
$schema: "https://opencode.ai/config.json",
|
|
agent: {
|
|
build: { disable: true },
|
|
plan: { disable: true },
|
|
},
|
|
}),
|
|
)
|
|
},
|
|
})
|
|
await Instance.provide({
|
|
directory: tmp.path,
|
|
fn: async () => {
|
|
const agents = await Agent.list()
|
|
const custom = agents.find((a) => a.name === "custom")
|
|
expect(custom).toBeDefined()
|
|
expect(custom?.mode).toBe("primary")
|
|
},
|
|
})
|
|
})
|