oh-my-opencode/src/tools/slashcommand/command-output-formatter.ts
YeonGyu-Kim 4400e18a52 refactor(slashcommand): split tools.ts into discovery and formatting modules
Extract slash command tool internals:
- command-discovery.ts: command finding and listing
- command-output-formatter.ts: output formatting
- skill-command-converter.ts: skill-to-command conversion
- slashcommand-description.ts: tool description generation
- slashcommand-tool.ts: core tool definition
2026-02-08 16:24:34 +09:00

74 lines
2.1 KiB
TypeScript

import { dirname } from "path"
import { resolveCommandsInText, resolveFileReferencesInText } from "../../shared"
import type { CommandInfo } from "./types"
export async function formatLoadedCommand(
command: CommandInfo,
userMessage?: string
): Promise<string> {
const sections: string[] = []
sections.push(`# /${command.name} Command\n`)
if (command.metadata.description) {
sections.push(`**Description**: ${command.metadata.description}\n`)
}
if (command.metadata.argumentHint) {
sections.push(`**Usage**: /${command.name} ${command.metadata.argumentHint}\n`)
}
if (userMessage) {
sections.push(`**Arguments**: ${userMessage}\n`)
}
if (command.metadata.model) {
sections.push(`**Model**: ${command.metadata.model}\n`)
}
if (command.metadata.agent) {
sections.push(`**Agent**: ${command.metadata.agent}\n`)
}
if (command.metadata.subtask) {
sections.push("**Subtask**: true\n")
}
sections.push(`**Scope**: ${command.scope}\n`)
sections.push("---\n")
sections.push("## Command Instructions\n")
let content = command.content || ""
if (!content && command.lazyContentLoader) {
content = await command.lazyContentLoader.load()
}
const commandDir = command.path ? dirname(command.path) : process.cwd()
const withFileReferences = await resolveFileReferencesInText(content, commandDir)
const resolvedContent = await resolveCommandsInText(withFileReferences)
let finalContent = resolvedContent.trim()
if (userMessage) {
finalContent = finalContent.replace(/\$\{user_message\}/g, userMessage)
}
sections.push(finalContent)
return sections.join("\n")
}
export function formatCommandList(items: CommandInfo[]): string {
if (items.length === 0) return "No commands or skills found."
const lines = ["# Available Commands & Skills\n"]
for (const command of items) {
const hint = command.metadata.argumentHint ? ` ${command.metadata.argumentHint}` : ""
lines.push(
`- **/${command.name}${hint}**: ${command.metadata.description || "(no description)"} (${command.scope})`
)
}
lines.push(`\n**Total**: ${items.length} items`)
return lines.join("\n")
}