diff --git a/src/features/opencode-skill-loader/async-loader.ts b/src/features/opencode-skill-loader/async-loader.ts index 74f1a8e..bfb1e7f 100644 --- a/src/features/opencode-skill-loader/async-loader.ts +++ b/src/features/opencode-skill-loader/async-loader.ts @@ -78,7 +78,9 @@ export async function loadSkillFromPathAsync( ): Promise { try { const content = await readFile(skillPath, "utf-8") - const { data, body } = parseFrontmatter(content) + const { data, body, parseError } = parseFrontmatter(content) + if (parseError) return null + const frontmatterMcp = parseSkillMcpConfigFromFrontmatter(content) const mcpJsonMcp = await loadMcpJsonFromDirAsync(resolvedPath) const mcpConfig = mcpJsonMcp || frontmatterMcp diff --git a/src/plugin-handlers/config-handler.ts b/src/plugin-handlers/config-handler.ts index 32b071a..ddc33f1 100644 --- a/src/plugin-handlers/config-handler.ts +++ b/src/plugin-handlers/config-handler.ts @@ -152,10 +152,13 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { if (builderEnabled) { const { name: _buildName, ...buildConfigWithoutName } = configAgent?.build ?? {}; + const migratedBuildConfig = migrateAgentConfig( + buildConfigWithoutName as Record + ); const openCodeBuilderOverride = pluginConfig.agents?.["OpenCode-Builder"]; const openCodeBuilderBase = { - ...buildConfigWithoutName, + ...migratedBuildConfig, description: `${configAgent?.build?.description ?? "Build agent"} (OpenCode default)`, }; @@ -167,10 +170,14 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { if (plannerEnabled) { const { name: _planName, ...planConfigWithoutName } = configAgent?.plan ?? {}; + const migratedPlanConfig = migrateAgentConfig( + planConfigWithoutName as Record + ); const plannerSisyphusOverride = pluginConfig.agents?.["Planner-Sisyphus"]; const plannerSisyphusBase = { - ...planConfigWithoutName, + ...migratedPlanConfig, + mode: "primary", prompt: PLAN_SYSTEM_PROMPT, permission: PLAN_PERMISSION, description: `${configAgent?.plan?.description ?? "Plan agent"} (OhMyOpenCode version)`, @@ -197,6 +204,14 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { ) : {}; + const migratedBuild = configAgent?.build + ? migrateAgentConfig(configAgent.build as Record) + : {}; + + const planDemoteConfig = replacePlan + ? { disable: true } + : undefined; + config.agent = { ...agentConfig, ...Object.fromEntries( @@ -206,10 +221,8 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { ...projectAgents, ...pluginAgents, ...filteredConfigAgents, - build: { ...configAgent?.build, mode: "subagent" }, - ...(replacePlan - ? { plan: { ...configAgent?.plan, mode: "subagent" } } - : {}), + build: { ...migratedBuild, mode: "subagent", hidden: true }, + ...(planDemoteConfig ? { plan: planDemoteConfig } : {}), }; } else { config.agent = { diff --git a/src/shared/frontmatter.ts b/src/shared/frontmatter.ts index 674b03d..db16420 100644 --- a/src/shared/frontmatter.ts +++ b/src/shared/frontmatter.ts @@ -3,6 +3,8 @@ import yaml from "js-yaml" export interface FrontmatterResult> { data: T body: string + hadFrontmatter: boolean + parseError: boolean } export function parseFrontmatter>( @@ -12,7 +14,7 @@ export function parseFrontmatter>( const match = content.match(frontmatterRegex) if (!match) { - return { data: {} as T, body: content } + return { data: {} as T, body: content, hadFrontmatter: false, parseError: false } } const yamlContent = match[1] @@ -22,8 +24,8 @@ export function parseFrontmatter>( // Use JSON_SCHEMA for security - prevents code execution via YAML tags const parsed = yaml.load(yamlContent, { schema: yaml.JSON_SCHEMA }) const data = (parsed ?? {}) as T - return { data, body } + return { data, body, hadFrontmatter: true, parseError: false } } catch { - return { data: {} as T, body } + return { data: {} as T, body, hadFrontmatter: true, parseError: true } } }