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
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user