phase 02: convert command to md files

This commit is contained in:
Adrian
2026-02-20 13:20:48 -05:00
parent da94da90db
commit f0b6ce9689
4 changed files with 146 additions and 12 deletions

View File

@@ -66,13 +66,12 @@ export function convertClaudeToOpenCode(
options: ClaudeToOpenCodeOptions,
): OpenCodeBundle {
const agentFiles = plugin.agents.map((agent) => convertAgent(agent, options))
const commandMap = convertCommands(plugin.commands)
const cmdFiles = convertCommands(plugin.commands)
const mcp = plugin.mcpServers ? convertMcp(plugin.mcpServers) : undefined
const plugins = plugin.hooks ? [convertHooks(plugin.hooks)] : []
const config: OpenCodeConfig = {
$schema: "https://opencode.ai/config.json",
command: Object.keys(commandMap).length > 0 ? commandMap : undefined,
mcp: mcp && Object.keys(mcp).length > 0 ? mcp : undefined,
}
@@ -81,6 +80,7 @@ export function convertClaudeToOpenCode(
return {
config,
agents: agentFiles,
commandFiles: cmdFiles,
plugins,
skillDirs: plugin.skills.map((skill) => ({ sourceDir: skill.sourceDir, name: skill.name })),
}
@@ -111,20 +111,22 @@ function convertAgent(agent: ClaudeAgent, options: ClaudeToOpenCodeOptions) {
}
}
function convertCommands(commands: ClaudeCommand[]): Record<string, OpenCodeCommandConfig> {
const result: Record<string, OpenCodeCommandConfig> = {}
// Commands are written as individual .md files rather than entries in opencode.json.
// Chosen over JSON map because opencode resolves commands by filename at runtime (ADR-001).
function convertCommands(commands: ClaudeCommand[]): OpenCodeCommandFile[] {
const files: OpenCodeCommandFile[] = []
for (const command of commands) {
if (command.disableModelInvocation) continue
const entry: OpenCodeCommandConfig = {
const frontmatter: Record<string, unknown> = {
description: command.description,
template: rewriteClaudePaths(command.body),
}
if (command.model && command.model !== "inherit") {
entry.model = normalizeModel(command.model)
frontmatter.model = normalizeModel(command.model)
}
result[command.name] = entry
const content = formatFrontmatter(frontmatter, rewriteClaudePaths(command.body))
files.push({ name: command.name, content })
}
return result
return files
}
function convertMcp(servers: Record<string, ClaudeMcpServer>): Record<string, OpenCodeMcpServer> {