From 72bc4ab403f758eb03429d8cfeffe3fb7bc606c3 Mon Sep 17 00:00:00 2001 From: Devin Foley Date: Wed, 25 Mar 2026 17:22:49 -0700 Subject: [PATCH 1/2] 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"); From 1549799c1e1f2d266248b39b7ac790bca7af1b14 Mon Sep 17 00:00:00 2001 From: Devin Foley Date: Wed, 25 Mar 2026 20:29:48 -0700 Subject: [PATCH 2/2] Move OPENCODE_DISABLE_PROJECT_CONFIG after envConfig loop Setting the env var before the user-config loop meant adapter env overrides could disable the guard. Move it after the loop so it always wins, matching the pattern already used in test.ts and models.ts. Co-Authored-By: Paperclip --- packages/adapters/opencode-local/src/server/execute.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/adapters/opencode-local/src/server/execute.ts b/packages/adapters/opencode-local/src/server/execute.ts index d39c3795..788ad835 100644 --- a/packages/adapters/opencode-local/src/server/execute.ts +++ b/packages/adapters/opencode-local/src/server/execute.ts @@ -128,10 +128,6 @@ 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()) || @@ -173,6 +169,11 @@ export async function execute(ctx: AdapterExecutionContext): Promise