From 72bc4ab403f758eb03429d8cfeffe3fb7bc606c3 Mon Sep 17 00:00:00 2001 From: Devin Foley Date: Wed, 25 Mar 2026 17:22:49 -0700 Subject: [PATCH] fix(opencode): prevent opencode.json config pollution in workspace Set OPENCODE_DISABLE_PROJECT_CONFIG=true in all OpenCode invocations (execute, model discovery, environment test) to stop the OpenCode CLI from writing an opencode.json file into the project working directory. Model selection is already passed via the --model CLI flag. Co-Authored-By: Paperclip --- packages/adapters/opencode-local/src/index.ts | 3 +++ packages/adapters/opencode-local/src/server/execute.ts | 4 ++++ packages/adapters/opencode-local/src/server/models.ts | 3 ++- packages/adapters/opencode-local/src/server/test.ts | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/adapters/opencode-local/src/index.ts b/packages/adapters/opencode-local/src/index.ts index 0c16e2d8..67fbdb4b 100644 --- a/packages/adapters/opencode-local/src/index.ts +++ b/packages/adapters/opencode-local/src/index.ts @@ -37,4 +37,7 @@ Notes: - Paperclip requires an explicit \`model\` value for \`opencode_local\` agents. - Runs are executed with: opencode run --format json ... - Sessions are resumed with --session when stored session cwd matches current cwd. +- The adapter sets OPENCODE_DISABLE_PROJECT_CONFIG=true to prevent OpenCode from \ + writing an opencode.json config file into the project working directory. Model \ + selection is passed via the --model CLI flag instead. `; diff --git a/packages/adapters/opencode-local/src/server/execute.ts b/packages/adapters/opencode-local/src/server/execute.ts index 09db7337..d39c3795 100644 --- a/packages/adapters/opencode-local/src/server/execute.ts +++ b/packages/adapters/opencode-local/src/server/execute.ts @@ -128,6 +128,10 @@ export async function execute(ctx: AdapterExecutionContext): Promise 0; const env: Record = { ...buildPaperclipEnv(agent) }; + // Prevent OpenCode from writing an opencode.json config file into the + // project working directory (which would pollute the git repo). Model + // selection is already handled via the --model CLI flag. + env.OPENCODE_DISABLE_PROJECT_CONFIG = "true"; env.PAPERCLIP_RUN_ID = runId; const wakeTaskId = (typeof context.taskId === "string" && context.taskId.trim().length > 0 && context.taskId.trim()) || diff --git a/packages/adapters/opencode-local/src/server/models.ts b/packages/adapters/opencode-local/src/server/models.ts index 94634d86..95cb1fc9 100644 --- a/packages/adapters/opencode-local/src/server/models.ts +++ b/packages/adapters/opencode-local/src/server/models.ts @@ -120,7 +120,8 @@ export async function discoverOpenCodeModels(input: { // /etc/passwd entry (e.g. `docker run --user 1234` with a minimal // image). Fall back to process.env.HOME. } - const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env, ...(resolvedHome ? { HOME: resolvedHome } : {}) })); + // Prevent OpenCode from writing an opencode.json into the working directory. + const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env, ...(resolvedHome ? { HOME: resolvedHome } : {}), OPENCODE_DISABLE_PROJECT_CONFIG: "true" })); const result = await runChildProcess( `opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`, diff --git a/packages/adapters/opencode-local/src/server/test.ts b/packages/adapters/opencode-local/src/server/test.ts index 5bb7aa36..ad3957d1 100644 --- a/packages/adapters/opencode-local/src/server/test.ts +++ b/packages/adapters/opencode-local/src/server/test.ts @@ -90,6 +90,8 @@ export async function testEnvironment( }); } + // Prevent OpenCode from writing an opencode.json into the working directory. + env.OPENCODE_DISABLE_PROJECT_CONFIG = "true"; const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env })); const cwdInvalid = checks.some((check) => check.code === "opencode_cwd_invalid");