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")}
`
}