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
74 lines
2.1 KiB
TypeScript
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")
|
|
}
|