From 2992902283060461634b88273fe6a4385c07ef88 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 5 Jan 2026 05:38:28 +0900 Subject: [PATCH] fix: skip invalid YAML skills and enable Planner-Sisyphus in Tab selector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Skip skills with invalid YAML frontmatter using new parseError flag - Add mode: "primary" to Planner-Sisyphus agent config for visibility - Prevents silent failures when loading skills with malformed YAML 🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode) --- .../opencode-skill-loader/async-loader.ts | 4 ++- src/plugin-handlers/config-handler.ts | 36 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) 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..d3831b3 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,25 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { ) : {}; + const migratedBuild = configAgent?.build + ? migrateAgentConfig(configAgent.build as Record) + : {}; + const migratedPlan = configAgent?.plan + ? migrateAgentConfig(configAgent.plan as Record) + : {}; + + const planDemoteConfig = replacePlan + ? { disable: true } + : undefined; + + log("DEBUG plan demotion", { + replacePlan, + plannerEnabled, + hasPlannerSisyphus: !!agentConfig["Planner-Sisyphus"], + planDemoteConfig, + configAgentPlan: configAgent?.plan, + }); + config.agent = { ...agentConfig, ...Object.fromEntries( @@ -206,10 +232,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 = {