import { describe, expect, test } from "bun:test" import path from "path" import { Effect } from "effect" import { Agent } from "../../src/agent/agent" import { Instance } from "../../src/project/instance" import { SystemPrompt } from "../../src/session/system" import { provideInstance, tmpdir } from "../fixture/fixture" function load(dir: string, fn: (svc: Agent.Interface) => Effect.Effect) { return Effect.runPromise(provideInstance(dir)(Agent.Service.use(fn)).pipe(Effect.provide(Agent.defaultLayer))) } describe("session.system", () => { test("skills output is sorted by name and stable across calls", async () => { await using tmp = await tmpdir({ git: true, init: async (dir) => { for (const [name, description] of [ ["zeta-skill", "Zeta skill."], ["alpha-skill", "Alpha skill."], ["middle-skill", "Middle skill."], ]) { const skillDir = path.join(dir, ".opencode", "skill", name) await Bun.write( path.join(skillDir, "SKILL.md"), `--- name: ${name} description: ${description} --- # ${name} `, ) } }, }) const home = process.env.OPENCODE_TEST_HOME process.env.OPENCODE_TEST_HOME = tmp.path try { await Instance.provide({ directory: tmp.path, fn: async () => { const build = await load(tmp.path, (svc) => svc.get("build")) const runSkills = Effect.gen(function* () { const svc = yield* SystemPrompt.Service return yield* svc.skills(build!) }).pipe(Effect.provide(SystemPrompt.defaultLayer)) const first = await Effect.runPromise(runSkills) const second = await Effect.runPromise(runSkills) expect(first).toBe(second) const alpha = first!.indexOf("alpha-skill") const middle = first!.indexOf("middle-skill") const zeta = first!.indexOf("zeta-skill") expect(alpha).toBeGreaterThan(-1) expect(middle).toBeGreaterThan(alpha) expect(zeta).toBeGreaterThan(middle) }, }) } finally { process.env.OPENCODE_TEST_HOME = home } }) })