| import fs from "fs/promises" |
| import path from "path" |
| import { describe, expect } from "bun:test" |
| import { Effect, Schema } from "effect" |
| import { CommandV2 } from "@opencode-ai/core/command" |
| import { Config } from "@opencode-ai/core/config" |
| import { ConfigCommandPlugin } from "@opencode-ai/core/config/plugin/command" |
| import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" |
| import { LayerNode } from "@opencode-ai/core/effect/layer-node" |
| import { FSUtil } from "@opencode-ai/core/fs-util" |
| import { ModelV2 } from "@opencode-ai/core/model" |
| import { ProviderV2 } from "@opencode-ai/core/provider" |
| import { AbsolutePath } from "@opencode-ai/core/schema" |
| import { tmpdir } from "../fixture/tmpdir" |
| import { testEffect } from "../lib/effect" |
| import { host } from "../plugin/host" |
|
|
| const it = testEffect(AppNodeBuilder.build(LayerNode.group([CommandV2.node, FSUtil.node]))) |
| const decode = Schema.decodeUnknownSync(Config.Info) |
|
|
| describe("ConfigCommandPlugin.Plugin", () => { |
| it.live("loads inline and file-based commands in config order", () => |
| Effect.acquireRelease( |
| Effect.promise(() => tmpdir()), |
| (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), |
| ).pipe( |
| Effect.flatMap((tmp) => |
| Effect.gen(function* () { |
| yield* Effect.promise(async () => { |
| await fs.mkdir(path.join(tmp.path, "commands", "nested"), { recursive: true }) |
| await fs.writeFile( |
| path.join(tmp.path, "commands", "review.md"), |
| `--- |
| description: File review |
| agent: reviewer |
| model: anthropic/claude |
| variant: high |
| subtask: true |
| --- |
| Review files`, |
| ) |
| await fs.writeFile(path.join(tmp.path, "commands", "nested", "docs.md"), "Write docs") |
| await fs.writeFile(path.join(tmp.path, "commands", "empty.md"), "") |
| }) |
|
|
| const command = yield* CommandV2.Service |
| yield* ConfigCommandPlugin.Plugin.effect(host({ command: { ...command, reload: command.reload } })).pipe( |
| Effect.provideService( |
| Config.Service, |
| Config.Service.of({ |
| entries: () => |
| Effect.succeed([ |
| new Config.Document({ |
| type: "document", |
| info: decode({ commands: { review: { template: "Inline review" } } }), |
| }), |
| new Config.Directory({ type: "directory", path: AbsolutePath.make(tmp.path) }), |
| ]), |
| }), |
| ), |
| ) |
|
|
| expect(yield* command.list()).toEqual([ |
| CommandV2.Info.make({ |
| name: "review", |
| template: "Review files", |
| description: "File review", |
| agent: "reviewer", |
| model: { |
| providerID: ProviderV2.ID.make("anthropic"), |
| id: ModelV2.ID.make("claude"), |
| variant: ModelV2.VariantID.make("high"), |
| }, |
| subtask: true, |
| }), |
| CommandV2.Info.make({ name: "empty", template: "" }), |
| CommandV2.Info.make({ name: "nested/docs", template: "Write docs" }), |
| ]) |
| }), |
| ), |
| ), |
| ) |
| }) |
|
|