diff --git a/src/features/claude-code-agent-loader/loader.ts b/src/features/claude-code-agent-loader/loader.ts index 407525687..459979428 100644 --- a/src/features/claude-code-agent-loader/loader.ts +++ b/src/features/claude-code-agent-loader/loader.ts @@ -44,7 +44,7 @@ function loadAgentsFromDir(agentsDir: string, scope: AgentScope): LoadedAgent[] const config: AgentConfig = { description: formattedDescription, - mode: "subagent", + mode: data.mode || "subagent", prompt: body.trim(), } diff --git a/src/features/claude-code-agent-loader/types.ts b/src/features/claude-code-agent-loader/types.ts index 4ffd9de40..0e6542d25 100644 --- a/src/features/claude-code-agent-loader/types.ts +++ b/src/features/claude-code-agent-loader/types.ts @@ -7,6 +7,7 @@ export interface AgentFrontmatter { description?: string model?: string tools?: string + mode?: "subagent" | "primary" | "all" } export interface LoadedAgent { diff --git a/src/plugin-handlers/agent-config-handler.ts b/src/plugin-handlers/agent-config-handler.ts index 08230f55a..9ceb92460 100644 --- a/src/plugin-handlers/agent-config-handler.ts +++ b/src/plugin-handlers/agent-config-handler.ts @@ -198,23 +198,47 @@ export async function applyAgentConfig(params: { ) : undefined; + // Collect all builtin agent names to prevent user/project .md files from overriding them + const builtinAgentNames = new Set([ + ...Object.keys(agentConfig), + ...Object.keys(builtinAgents), + ]); + + // Filter user/project agents that duplicate builtin agents (they have mode: "subagent" hardcoded + // in loadAgentsFromDir which would incorrectly override the builtin mode: "primary") + const filteredUserAgents = Object.fromEntries( + Object.entries(userAgents).filter(([key]) => !builtinAgentNames.has(key)), + ); + const filteredProjectAgents = Object.fromEntries( + Object.entries(projectAgents).filter(([key]) => !builtinAgentNames.has(key)), + ); + params.config.agent = { ...agentConfig, ...Object.fromEntries( Object.entries(builtinAgents).filter(([key]) => key !== "sisyphus"), ), - ...filterDisabledAgents(userAgents), - ...filterDisabledAgents(projectAgents), + ...filterDisabledAgents(filteredUserAgents), + ...filterDisabledAgents(filteredProjectAgents), ...filterDisabledAgents(pluginAgents), ...filteredConfigAgents, build: { ...migratedBuild, mode: "subagent", hidden: true }, ...(planDemoteConfig ? { plan: planDemoteConfig } : {}), }; } else { + // Filter user/project agents that duplicate builtin agents + const builtinAgentNames = new Set(Object.keys(builtinAgents)); + const filteredUserAgents = Object.fromEntries( + Object.entries(userAgents).filter(([key]) => !builtinAgentNames.has(key)), + ); + const filteredProjectAgents = Object.fromEntries( + Object.entries(projectAgents).filter(([key]) => !builtinAgentNames.has(key)), + ); + params.config.agent = { ...builtinAgents, - ...filterDisabledAgents(userAgents), - ...filterDisabledAgents(projectAgents), + ...filterDisabledAgents(filteredUserAgents), + ...filterDisabledAgents(filteredProjectAgents), ...filterDisabledAgents(pluginAgents), ...configAgent, };