diff --git a/packages/opencode/test/config/agent-color.test.ts b/packages/opencode/test/config/agent-color.test.ts
index fd3d73fd17..49509156ab 100644
--- a/packages/opencode/test/config/agent-color.test.ts
+++ b/packages/opencode/test/config/agent-color.test.ts
@@ -1,67 +1,59 @@
import { test, expect } from "bun:test"
-import { Effect } from "effect"
+import { Effect, Layer } from "effect"
+import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import path from "path"
-import { provideInstance, tmpdir } from "../fixture/fixture"
-import { Instance } from "../../src/project/instance"
+import { provideInstance, tmpdirScoped } from "../fixture/fixture"
import { Config } from "@/config/config"
import { Agent as AgentSvc } from "../../src/agent/agent"
import { Color } from "@/util/color"
import { AppRuntime } from "../../src/effect/app-runtime"
+import { testEffect } from "../lib/effect"
-const load = () => AppRuntime.runPromise(Config.Service.use((svc) => svc.get()))
-const agent = (dir: string, fn: (svc: AgentSvc.Interface) => Effect.Effect) =>
- Effect.runPromise(provideInstance(dir)(AgentSvc.Service.use(fn)).pipe(Effect.provide(AgentSvc.defaultLayer)))
+const it = testEffect(Layer.mergeAll(AgentSvc.defaultLayer, CrossSpawnSpawner.defaultLayer))
-test("agent color parsed from project config", 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: { color: "#FFA500" },
- plan: { color: "primary" },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- fn: async () => {
- const cfg = await load()
+const writeConfig = (dir: string, agent: Config.Info["agent"]) =>
+ Effect.promise(() =>
+ Bun.write(
+ path.join(dir, "opencode.json"),
+ JSON.stringify({
+ $schema: "https://opencode.ai/config.json",
+ agent,
+ }),
+ ),
+ )
+
+it.live("agent color parsed from project config", () =>
+ Effect.gen(function* () {
+ const dir = yield* tmpdirScoped()
+ yield* writeConfig(dir, {
+ build: { color: "#FFA500" },
+ plan: { color: "primary" },
+ })
+
+ yield* Effect.gen(function* () {
+ const cfg = yield* Effect.promise(() => AppRuntime.runPromise(Config.Service.use((svc) => svc.get())))
expect(cfg.agent?.["build"]?.color).toBe("#FFA500")
expect(cfg.agent?.["plan"]?.color).toBe("primary")
- },
- })
-})
+ }).pipe(provideInstance(dir))
+ }),
+)
-test("Agent.get includes color from config", 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: {
- plan: { color: "#A855F7" },
- build: { color: "accent" },
- },
- }),
- )
- },
- })
- await Instance.provide({
- directory: tmp.path,
- fn: async () => {
- const plan = await agent(tmp.path, (svc) => svc.get("plan"))
+it.live("Agent.get includes color from config", () =>
+ Effect.gen(function* () {
+ const dir = yield* tmpdirScoped()
+ yield* writeConfig(dir, {
+ plan: { color: "#A855F7" },
+ build: { color: "accent" },
+ })
+
+ yield* Effect.gen(function* () {
+ const plan = yield* AgentSvc.Service.use((svc) => svc.get("plan"))
expect(plan?.color).toBe("#A855F7")
- const build = await agent(tmp.path, (svc) => svc.get("build"))
+ const build = yield* AgentSvc.Service.use((svc) => svc.get("build"))
expect(build?.color).toBe("accent")
- },
- })
-})
+ }).pipe(provideInstance(dir))
+ }),
+)
test("Color.hexToAnsiBold converts valid hex to ANSI", () => {
const result = Color.hexToAnsiBold("#FFA500")