import { describe, expect } from "bun:test" import { Effect, Layer } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { AbsolutePath } from "@opencode-ai/core/schema" import { Reference } from "@opencode-ai/core/reference" import { ReferenceGuidance } from "@opencode-ai/core/reference/guidance" import { SystemContext } from "@opencode-ai/core/system-context/index" import { it } from "./lib/effect" const guidanceLayer = (referenceLayer: Layer.Layer) => AppNodeBuilder.build(ReferenceGuidance.node, [[Reference.node, referenceLayer]]) describe("ReferenceGuidance", () => { it.effect("lists available references in the system context", () => Effect.gen(function* () { const guidance = yield* ReferenceGuidance.Service const generation = yield* SystemContext.initialize(yield* guidance.load()) expect(generation.baseline).toContain("") expect(generation.baseline).toContain("docs") expect(generation.baseline).toContain("/docs") expect(generation.baseline).toContain("Use for product documentation") }).pipe( Effect.provide( guidanceLayer( Layer.mock(Reference.Service, { list: () => Effect.succeed([ new Reference.Info({ name: "docs", path: AbsolutePath.make("/docs"), description: "Use for product documentation", source: Reference.LocalSource.make({ type: "local", path: AbsolutePath.make("/docs"), description: "Use for product documentation", }), }), ]), }), ), ), ), ) it.effect("omits guidance when no references are available", () => Effect.gen(function* () { const guidance = yield* ReferenceGuidance.Service const generation = yield* SystemContext.initialize(yield* guidance.load()) expect(generation.baseline).toBe("") }).pipe(Effect.provide(guidanceLayer(Layer.mock(Reference.Service, { list: () => Effect.succeed([]) })))), ) it.effect("omits references without descriptions", () => Effect.gen(function* () { const guidance = yield* ReferenceGuidance.Service const generation = yield* SystemContext.initialize(yield* guidance.load()) expect(generation.baseline).toBe("") }).pipe( Effect.provide( guidanceLayer( Layer.mock(Reference.Service, { list: () => Effect.succeed([ new Reference.Info({ name: "docs", path: AbsolutePath.make("/docs"), source: Reference.LocalSource.make({ type: "local", path: AbsolutePath.make("/docs") }), }), ]), }), ), ), ), ) })