/// import { afterEach, beforeEach, describe, expect, spyOn, test } from "bun:test"; import * as builtinCommands from "../features/builtin-commands"; import * as commandLoader from "../features/claude-code-command-loader"; import * as skillLoader from "../features/opencode-skill-loader"; import type { OhMyOpenCodeConfig } from "../config"; import type { PluginComponents } from "./plugin-components-loader"; import { applyCommandConfig } from "./command-config-handler"; import { getAgentDisplayName, getAgentListDisplayName, } from "../shared/agent-display-names"; function createPluginComponents(): PluginComponents { return { commands: {}, skills: {}, agents: {}, mcpServers: {}, hooksConfigs: [], plugins: [], errors: [], }; } function createPluginConfig(): OhMyOpenCodeConfig { return { git_master: { commit_footer: true, include_co_authored_by: true, git_env_prefix: "GIT_MASTER=1", }, }; } describe("applyCommandConfig", () => { let loadBuiltinCommandsSpy: ReturnType; let loadUserCommandsSpy: ReturnType; let loadProjectCommandsSpy: ReturnType; let loadOpencodeGlobalCommandsSpy: ReturnType; let loadOpencodeProjectCommandsSpy: ReturnType; let discoverConfigSourceSkillsSpy: ReturnType; let loadUserSkillsSpy: ReturnType; let loadProjectSkillsSpy: ReturnType; let loadOpencodeGlobalSkillsSpy: ReturnType; let loadOpencodeProjectSkillsSpy: ReturnType; let loadProjectAgentsSkillsSpy: ReturnType; let loadGlobalAgentsSkillsSpy: ReturnType; beforeEach(() => { loadBuiltinCommandsSpy = spyOn(builtinCommands, "loadBuiltinCommands").mockReturnValue({}); loadUserCommandsSpy = spyOn(commandLoader, "loadUserCommands").mockResolvedValue({}); loadProjectCommandsSpy = spyOn(commandLoader, "loadProjectCommands").mockResolvedValue({}); loadOpencodeGlobalCommandsSpy = spyOn(commandLoader, "loadOpencodeGlobalCommands").mockResolvedValue({}); loadOpencodeProjectCommandsSpy = spyOn(commandLoader, "loadOpencodeProjectCommands").mockResolvedValue({}); discoverConfigSourceSkillsSpy = spyOn(skillLoader, "discoverConfigSourceSkills").mockResolvedValue([]); loadUserSkillsSpy = spyOn(skillLoader, "loadUserSkills").mockResolvedValue({}); loadProjectSkillsSpy = spyOn(skillLoader, "loadProjectSkills").mockResolvedValue({}); loadOpencodeGlobalSkillsSpy = spyOn(skillLoader, "loadOpencodeGlobalSkills").mockResolvedValue({}); loadOpencodeProjectSkillsSpy = spyOn(skillLoader, "loadOpencodeProjectSkills").mockResolvedValue({}); loadProjectAgentsSkillsSpy = spyOn(skillLoader, "loadProjectAgentsSkills").mockResolvedValue({}); loadGlobalAgentsSkillsSpy = spyOn(skillLoader, "loadGlobalAgentsSkills").mockResolvedValue({}); }); afterEach(() => { loadBuiltinCommandsSpy.mockRestore(); loadUserCommandsSpy.mockRestore(); loadProjectCommandsSpy.mockRestore(); loadOpencodeGlobalCommandsSpy.mockRestore(); loadOpencodeProjectCommandsSpy.mockRestore(); discoverConfigSourceSkillsSpy.mockRestore(); loadUserSkillsSpy.mockRestore(); loadProjectSkillsSpy.mockRestore(); loadOpencodeGlobalSkillsSpy.mockRestore(); loadOpencodeProjectSkillsSpy.mockRestore(); loadProjectAgentsSkillsSpy.mockRestore(); loadGlobalAgentsSkillsSpy.mockRestore(); }); test("includes .agents skills in command config", async () => { // given loadProjectAgentsSkillsSpy.mockResolvedValue({ "agents-project-skill": { description: "(project - Skill) Agents project skill", template: "template", }, }); loadGlobalAgentsSkillsSpy.mockResolvedValue({ "agents-global-skill": { description: "(user - Skill) Agents global skill", template: "template", }, }); const config: Record = { command: {} }; // when await applyCommandConfig({ config, pluginConfig: createPluginConfig(), ctx: { directory: "/tmp" }, pluginComponents: createPluginComponents(), }); // then const commandConfig = config.command as Record; expect(commandConfig["agents-project-skill"]?.description).toContain("Agents project skill"); expect(commandConfig["agents-global-skill"]?.description).toContain("Agents global skill"); }); test("normalizes Atlas command agents to the runtime list name used by opencode command routing", async () => { // given loadBuiltinCommandsSpy.mockReturnValue({ "start-work": { name: "start-work", description: "(builtin) Start work", template: "template", agent: "atlas", }, }); const config: Record = { command: {} }; // when await applyCommandConfig({ config, pluginConfig: createPluginConfig(), ctx: { directory: "/tmp" }, pluginComponents: createPluginComponents(), }); // then const commandConfig = config.command as Record; expect(commandConfig["start-work"]?.agent).toBe(getAgentListDisplayName("atlas")); }); test("normalizes legacy display-name command agents to the runtime list name", async () => { // given loadBuiltinCommandsSpy.mockReturnValue({ "start-work": { name: "start-work", description: "(builtin) Start work", template: "template", agent: getAgentDisplayName("atlas"), }, }); const config: Record = { command: {} }; // when await applyCommandConfig({ config, pluginConfig: createPluginConfig(), ctx: { directory: "/tmp" }, pluginComponents: createPluginComponents(), }); // then const commandConfig = config.command as Record; expect(commandConfig["start-work"]?.agent).toBe(getAgentListDisplayName("atlas")); }); });