From 3750265ff72f89782ea4143a9143b91c5f1eda49 Mon Sep 17 00:00:00 2001 From: MoerAI Date: Mon, 13 Apr 2026 19:01:10 +0900 Subject: [PATCH 1/3] fix(skill-loader): coerce numeric frontmatter command names to strings --- .../loaded-skill-from-path.ts | 2 +- .../opencode-skill-loader/loader.test.ts | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/features/opencode-skill-loader/loaded-skill-from-path.ts b/src/features/opencode-skill-loader/loaded-skill-from-path.ts index c948558281..f746e97517 100644 --- a/src/features/opencode-skill-loader/loaded-skill-from-path.ts +++ b/src/features/opencode-skill-loader/loaded-skill-from-path.ts @@ -25,7 +25,7 @@ export async function loadSkillFromPath(options: { const mcpJsonMcp = await loadMcpJsonFromDir(options.resolvedPath) const mcpConfig = mcpJsonMcp || frontmatterMcp - const baseName = data.name || options.defaultName + const baseName = data.name == null ? options.defaultName : String(data.name) const skillName = namePrefix ? `${namePrefix}/${baseName}` : baseName const originalDescription = data.description || "" const isOpencodeSource = options.scope === "opencode" || options.scope === "opencode-project" diff --git a/src/features/opencode-skill-loader/loader.test.ts b/src/features/opencode-skill-loader/loader.test.ts index c5042e0b1b..5770f70ac7 100644 --- a/src/features/opencode-skill-loader/loader.test.ts +++ b/src/features/opencode-skill-loader/loader.test.ts @@ -100,6 +100,34 @@ This is a simple skill. } }) + it("coerces numeric frontmatter names to strings", async () => { + // given + const skillContent = `--- +name: 12306 +description: Numeric skill name +--- +This skill name should still load. +` + createTestSkill("12306", skillContent) + + // when + const { discoverSkills } = await import("./loader") + const originalCwd = process.cwd() + process.chdir(TEST_DIR) + + try { + const skills = await discoverSkills({ includeClaudeCodePaths: false }) + const skill = skills.find(s => s.name === "12306") + + // then + expect(skill).toBeDefined() + expect(typeof skill?.name).toBe("string") + expect(skill?.definition.name).toBe("12306") + } finally { + process.chdir(originalCwd) + } + }) + it("preserves env var placeholders without expansion", async () => { // given const skillContent = `--- From 7d98ab011c7ba73a902cac0a02e558e603a5f6a1 Mon Sep 17 00:00:00 2001 From: MoerAI Date: Mon, 13 Apr 2026 19:15:27 +0900 Subject: [PATCH 2/3] fix(model-requirements): move github-copilot from gpt-5-nano to gpt-5.4 for multimodal-looker (fixes #3359) --- .../__snapshots__/model-fallback.test.ts.snap | 18 ++++++++++++------ src/shared/model-requirements.ts | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index 88f86f97ba..eccdde79c3 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -1425,7 +1425,8 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models when "variant": "xhigh", }, "multimodal-looker": { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, "oracle": { "fallback_models": [ @@ -1611,7 +1612,8 @@ exports[`generateModelConfig fallback providers uses GitHub Copilot models with "variant": "xhigh", }, "multimodal-looker": { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, "oracle": { "fallback_models": [ @@ -2229,7 +2231,8 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb "model": "openai/gpt-5-nano", }, { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, ], "model": "openai/gpt-5.4", @@ -2740,7 +2743,8 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider "model": "zai-coding-plan/glm-4.6v", }, { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, { "model": "opencode/gpt-5-nano", @@ -3178,7 +3182,8 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe "model": "openai/gpt-5-nano", }, { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, { "model": "opencode/gpt-5-nano", @@ -3732,7 +3737,8 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is "model": "openai/gpt-5-nano", }, { - "model": "github-copilot/gpt-5-nano", + "model": "github-copilot/gpt-5.4", + "variant": "medium", }, { "model": "opencode/gpt-5-nano", diff --git a/src/shared/model-requirements.ts b/src/shared/model-requirements.ts index b9ac989ab5..e2bb13be0b 100644 --- a/src/shared/model-requirements.ts +++ b/src/shared/model-requirements.ts @@ -94,10 +94,10 @@ export const AGENT_MODEL_REQUIREMENTS: Record = { }, "multimodal-looker": { fallbackChain: [ - { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, + { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" }, { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" }, { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" }, - { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }, + { providers: ["openai", "opencode", "vercel"], model: "gpt-5-nano" }, ], }, prometheus: { From 8d003ac01ec03f66d1c9e01182da66f049948b7b Mon Sep 17 00:00:00 2001 From: MoerAI Date: Tue, 14 Apr 2026 19:04:27 +0900 Subject: [PATCH 3/3] fix: regenerate model-fallback snapshots after github-copilot provider change --- .../__snapshots__/model-fallback.test.ts.snap | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/cli/__snapshots__/model-fallback.test.ts.snap b/src/cli/__snapshots__/model-fallback.test.ts.snap index eccdde79c3..239de2a9cc 100644 --- a/src/cli/__snapshots__/model-fallback.test.ts.snap +++ b/src/cli/__snapshots__/model-fallback.test.ts.snap @@ -2227,13 +2227,13 @@ exports[`generateModelConfig mixed provider scenarios uses OpenAI + Copilot comb }, "multimodal-looker": { "fallback_models": [ - { - "model": "openai/gpt-5-nano", - }, { "model": "github-copilot/gpt-5.4", "variant": "medium", }, + { + "model": "openai/gpt-5-nano", + }, ], "model": "openai/gpt-5.4", "variant": "medium", @@ -2740,17 +2740,17 @@ exports[`generateModelConfig mixed provider scenarios uses all fallback provider "multimodal-looker": { "fallback_models": [ { - "model": "zai-coding-plan/glm-4.6v", + "model": "opencode/gpt-5.4", + "variant": "medium", }, { - "model": "github-copilot/gpt-5.4", - "variant": "medium", + "model": "zai-coding-plan/glm-4.6v", }, { "model": "opencode/gpt-5-nano", }, ], - "model": "opencode/gpt-5.4", + "model": "github-copilot/gpt-5.4", "variant": "medium", }, "oracle": { @@ -3171,6 +3171,10 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe }, "multimodal-looker": { "fallback_models": [ + { + "model": "github-copilot/gpt-5.4", + "variant": "medium", + }, { "model": "opencode/gpt-5.4", "variant": "medium", @@ -3181,10 +3185,6 @@ exports[`generateModelConfig mixed provider scenarios uses all providers togethe { "model": "openai/gpt-5-nano", }, - { - "model": "github-copilot/gpt-5.4", - "variant": "medium", - }, { "model": "opencode/gpt-5-nano", }, @@ -3726,6 +3726,10 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is }, "multimodal-looker": { "fallback_models": [ + { + "model": "github-copilot/gpt-5.4", + "variant": "medium", + }, { "model": "opencode/gpt-5.4", "variant": "medium", @@ -3736,10 +3740,6 @@ exports[`generateModelConfig mixed provider scenarios uses all providers with is { "model": "openai/gpt-5-nano", }, - { - "model": "github-copilot/gpt-5.4", - "variant": "medium", - }, { "model": "opencode/gpt-5-nano", },