import { TOOL_DESCRIPTION_NO_SKILLS, TOOL_DESCRIPTION_PREFIX } from "./constants" import { sortByScopePriority } from "./scope-priority" import type { SkillInfo } from "./types" import type { CommandInfo } from "../slashcommand/types" function formatSkillCommand(skill: SkillInfo): string { const lines = [ " ", ` /${skill.name}`, ` ${skill.description}`, ` ${skill.scope}`, ] if (skill.compatibility) { lines.push(` ${skill.compatibility}`) } lines.push(" ") return lines.join("\n") } function formatSlashCommand(command: CommandInfo): string { const argumentHint = typeof command.metadata.argumentHint === "string" ? command.metadata.argumentHint.trim() : undefined const lines = [ " ", ` /${command.name}`, ` ${command.metadata.description || "(no description)"}`, ` ${command.scope}`, ] if (argumentHint) { lines.push(` ${argumentHint}`) } lines.push(" ") return lines.join("\n") } export function formatCombinedDescription(skills?: SkillInfo[], commands?: CommandInfo[]): string { const availableSkills = skills ?? [] const availableCommands = commands ?? [] if (availableSkills.length === 0 && availableCommands.length === 0) { return TOOL_DESCRIPTION_NO_SKILLS } const availableItems = [ ...sortByScopePriority(availableSkills).map(formatSkillCommand), ...sortByScopePriority(availableCommands).map(formatSlashCommand), ] if (availableItems.length === 0) { return TOOL_DESCRIPTION_PREFIX } return `${TOOL_DESCRIPTION_PREFIX} Priority: project > user > opencode > builtin/plugin | Skills listed before commands Invoke via: skill(name="item-name") - omit leading slash for commands. ${availableItems.join("\n")} ` }