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");