| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- 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")
- },
- })
- })
|