Buckets:
| import path from "path" | |
| import { describe, expect } from "bun:test" | |
| import { Effect, Layer, Schema } from "effect" | |
| import { Config } from "@opencode-ai/core/config" | |
| import { ConfigSkillPlugin } from "@opencode-ai/core/config/plugin/skill" | |
| import { Global } from "@opencode-ai/core/global" | |
| import { Location } from "@opencode-ai/core/location" | |
| import { AbsolutePath } from "@opencode-ai/core/schema" | |
| import { SkillV2 } from "@opencode-ai/core/skill" | |
| import { location } from "../fixture/location" | |
| import { testEffect } from "../lib/effect" | |
| const it = testEffect(Layer.empty) | |
| const decode = Schema.decodeUnknownSync(Config.Info) | |
| describe("ConfigSkillPlugin.Plugin", () => { | |
| it.effect("registers configured skill directories and URLs", () => | |
| Effect.gen(function* () { | |
| const directory = AbsolutePath.make("/repo/packages/app") | |
| const sources: SkillV2.Source[] = [] | |
| const transform = Effect.fnUntraced(function* () { | |
| return Effect.fnUntraced(function* (update: (editor: SkillV2.Editor) => void) { | |
| update({ | |
| source: (source) => sources.push(source), | |
| list: () => sources, | |
| }) | |
| }) | |
| }) | |
| yield* ConfigSkillPlugin.Plugin.effect.pipe( | |
| Effect.provideService( | |
| Config.Service, | |
| Config.Service.of({ | |
| entries: () => | |
| Effect.succeed([ | |
| new Config.Directory({ type: "directory", path: AbsolutePath.make("/repo/.opencode") }), | |
| new Config.Document({ | |
| type: "document", | |
| info: decode({ | |
| skills: ["./skills", "~/shared-skills", "/opt/skills", "https://example.test/skills/"], | |
| }), | |
| }), | |
| ]), | |
| }), | |
| ), | |
| Effect.provideService(Global.Service, Global.Service.of(Global.make({ home: "/home/test" }))), | |
| Effect.provideService(Location.Service, Location.Service.of(location({ directory }))), | |
| Effect.provideService( | |
| SkillV2.Service, | |
| SkillV2.Service.of({ | |
| transform, | |
| sources: () => Effect.succeed(sources), | |
| list: () => Effect.succeed([]), | |
| }), | |
| ), | |
| ) | |
| expect(sources).toEqual([ | |
| new SkillV2.DirectorySource({ | |
| type: "directory", | |
| path: AbsolutePath.make(path.join("/repo/.opencode", "skill")), | |
| }), | |
| new SkillV2.DirectorySource({ | |
| type: "directory", | |
| path: AbsolutePath.make(path.join("/repo/.opencode", "skills")), | |
| }), | |
| new SkillV2.DirectorySource({ type: "directory", path: AbsolutePath.make(path.join(directory, "skills")) }), | |
| new SkillV2.DirectorySource({ | |
| type: "directory", | |
| path: AbsolutePath.make(path.join("/home/test", "shared-skills")), | |
| }), | |
| new SkillV2.DirectorySource({ type: "directory", path: AbsolutePath.make("/opt/skills") }), | |
| new SkillV2.UrlSource({ type: "url", url: "https://example.test/skills/" }), | |
| ]) | |
| }), | |
| ) | |
| }) | |
Xet Storage Details
- Size:
- 3.03 kB
- Xet hash:
- af95d83b7121b110d26eb9f2aabc9d1bdf3f69340f5b2fdb51c58258a7092787
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.