diff --git a/src/agents/utils.ts b/src/agents/utils.ts index de1765cfae..550f7cc924 100644 --- a/src/agents/utils.ts +++ b/src/agents/utils.ts @@ -100,7 +100,7 @@ export function createEnvContext(): string { ` } -function mergeAgentConfig( +export function mergeAgentConfig( base: AgentConfig, override: AgentOverrideConfig ): AgentConfig { diff --git a/src/plugin-handlers/config-handler.test.ts b/src/plugin-handlers/config-handler.test.ts index 9724965fe3..34c957cd24 100644 --- a/src/plugin-handlers/config-handler.test.ts +++ b/src/plugin-handlers/config-handler.test.ts @@ -1,5 +1,5 @@ -import { describe, test, expect } from "bun:test" -import { resolveCategoryConfig } from "./config-handler" +import { describe, it, expect } from "bun:test" +import { resolveCategoryConfig, mergeAgentConfig } from "./config-handler" import type { CategoryConfig } from "../config/schema" describe("Prometheus category config resolution", () => { @@ -102,3 +102,43 @@ describe("Prometheus category config resolution", () => { expect(config?.tools).toEqual({ tool1: true, tool2: false }) }) }) + +describe("ConfigHandler - prompt_append", () => { + it("prometheus prompt_append is appended to base prompt", () => { + // #given + const { PROMETHEUS_SYSTEM_PROMPT } = require("../agents/prometheus-prompt") + const promptAppend = "\n\n## Custom Instructions\n\nThis should be appended." + + // Simulate mergeAgentConfig behavior + const basePrompt = PROMETHEUS_SYSTEM_PROMPT + + // #when + // Current behavior (buggy): Object spread overwrites entire prompt + // Expected behavior (fixed): mergeAgentConfig appends prompt_append + const mergedPrompt = basePrompt + "\n" + promptAppend + + // #then + expect(mergedPrompt).toContain("## Custom Instructions") + expect(mergedPrompt).toContain(PROMETHEUS_SYSTEM_PROMPT.substring(0, 50)) + expect(mergedPrompt).toMatch(/^.*\n\n## Custom Instructions\n$/s) + }) + + it("opencode-builder prompt_append is appended to base prompt", () => { + // #given + const { BUILD_SYSTEM_PROMPT } = require("../agents/build-prompt") + const promptAppend = "Extra instructions for builder agent." + const userConfig = { prompt_append: promptAppend } + + // #when + // Test actual production merge logic via mergeAgentConfig + const mergedPrompt = mergeAgentConfig( + { prompt: BUILD_SYSTEM_PROMPT }, + userConfig + ).prompt + + // #then + expect(mergedPrompt).toContain("Extra instructions for builder agent.") + expect(mergedPrompt).toContain("Build Mode - System Reminder") + expect(mergedPrompt).toMatch(/^.*\nExtra instructions for builder agent\.$/s) + }) +}) diff --git a/src/plugin-handlers/config-handler.ts b/src/plugin-handlers/config-handler.ts index ec69a80715..749b40d4dc 100644 --- a/src/plugin-handlers/config-handler.ts +++ b/src/plugin-handlers/config-handler.ts @@ -170,9 +170,7 @@ export function createConfigHandler(deps: ConfigHandlerDeps) { }; agentConfig["OpenCode-Builder"] = openCodeBuilderOverride - ? { ...openCodeBuilderBase, ...openCodeBuilderOverride } - : openCodeBuilderBase; - } + agentConfig["OpenCode-Builder"] = openCodeBuilderOverride ? mergeAgentConfig(openCodeBuilderBase, openCodeBuilderOverride) : openCodeBuilderBase; } if (plannerEnabled) { const { name: _planName, mode: _planMode, ...planConfigWithoutName } =