skill.test.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { describe, expect } from "bun:test"
  2. import { NodeFileSystem } from "@effect/platform-node"
  3. import { Config } from "@opencode-ai/core/config"
  4. import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
  5. import { FSUtil } from "@opencode-ai/util/fs-util"
  6. import { Location } from "@opencode-ai/core/location"
  7. import { Effect, Stream } from "effect"
  8. import { SkillPlugin } from "@opencode-ai/core/plugin/skill"
  9. import { AbsolutePath } from "@opencode-ai/core/schema"
  10. import { Skill } from "@opencode-ai/core/skill"
  11. import { location } from "../fixture/location"
  12. import { testEffect } from "../lib/effect"
  13. import { host } from "./host"
  14. const it = testEffect(AppNodeBuilder.build(Skill.node))
  15. describe("SkillPlugin.Plugin", () => {
  16. it.effect("registers built-in skills", () =>
  17. Effect.gen(function* () {
  18. const skill = yield* Skill.Service
  19. yield* SkillPlugin.Plugin.effect(
  20. host({
  21. app: { name: "test", version: "1.2.3", channel: "beta" },
  22. skill: {
  23. list: () => Effect.die("unused skill.list"),
  24. transform: skill.transform,
  25. reload: skill.reload,
  26. },
  27. }),
  28. ).pipe(
  29. Effect.provide(Config.testLayer()),
  30. Effect.provideService(
  31. Location.Service,
  32. Location.Service.of(location({ directory: AbsolutePath.make(import.meta.dir) })),
  33. ),
  34. Effect.provide(AppNodeBuilder.build(FSUtil.node)),
  35. Effect.provide(NodeFileSystem.layer),
  36. )
  37. const skills = yield* skill.list()
  38. const report = skills.find((item) => item.id === "report")
  39. expect(skills).toContainEqual(
  40. expect.objectContaining({
  41. id: "opencode",
  42. name: "OpenCode",
  43. description: expect.stringContaining("any question about OpenCode itself"),
  44. }),
  45. )
  46. expect(skills).toContainEqual(
  47. expect.objectContaining({
  48. id: "report",
  49. name: "Report",
  50. description: expect.stringContaining("opencode issue"),
  51. }),
  52. )
  53. expect(report?.slash).toBe(true)
  54. expect(report?.content).toContain("- opencode version: 1.2.3")
  55. expect(report?.content).toContain("- install/channel: beta")
  56. }),
  57. )
  58. })