From 9005abec4e44f2cff0b632b866981a823102d30e Mon Sep 17 00:00:00 2001 From: trick77 Date: Tue, 9 Jun 2026 21:19:52 +0200 Subject: [PATCH] Add agent runaway guard preset --- README.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- presets/agent-runaway-guard.conf | 24 ++++++++++++++++++++++++ test/builtin-presets.test.ts | 27 +++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 presets/agent-runaway-guard.conf diff --git a/README.md b/README.md index 70a4125..c5cfe0e 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,7 @@ on a readline for the next. | `permissions-build-tools` | Permissions | merge | Build tools (node, npm, mvn, gradle, make, python, pip, cargo, go) | | `permissions-container-info` | Permissions | merge | Read-only docker, podman, oc inspection commands | | `permissions-toolchain-info` | Permissions | merge | Version probes for common dev toolchains | +| `agent-runaway-guard` | Agent | merge | Adds step limits to built-in agents to prevent runaway tool loops | | `default-agent-plan` | Agent | replace | Sets the default agent to "plan" so opencode always starts in plan mode instead of build mode | | `tui-disable-mouse` | TUI | replace | Disables TUI mouse capture so native terminal selection and scrolling keep working | diff --git a/package-lock.json b/package-lock.json index 4f8d04a..d1949ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "opencode-presets", - "version": "0.8.6", + "version": "0.8.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "opencode-presets", - "version": "0.8.6", + "version": "0.8.7", "license": "MIT", "dependencies": { "ajv": "8.20.0", diff --git a/package.json b/package.json index a6f0fc1..91f1ed5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opencode-presets", - "version": "0.8.6", + "version": "0.8.7", "description": "Interactive CLI that patches OpenCode config files with curated presets — LSP, MCP, permissions, TUI.", "type": "module", "bin": { diff --git a/presets/agent-runaway-guard.conf b/presets/agent-runaway-guard.conf new file mode 100644 index 0000000..13200ec --- /dev/null +++ b/presets/agent-runaway-guard.conf @@ -0,0 +1,24 @@ +// @name: agent-runaway-guard +// @description: Adds practical step limits to opencode's built-in agents to +// prevent runaway tool loops while keeping normal coding workflows usable. +// @author: Jan +// @version: 0.1.0 +// @path: agent +// @mode: merge +{ + "build": { + "steps": 50 + }, + "plan": { + "steps": 20 + }, + "general": { + "steps": 15 + }, + "explore": { + "steps": 10 + }, + "scout": { + "steps": 10 + } +} diff --git a/test/builtin-presets.test.ts b/test/builtin-presets.test.ts index d37b6bc..276674a 100644 --- a/test/builtin-presets.test.ts +++ b/test/builtin-presets.test.ts @@ -15,3 +15,30 @@ test('ships a preset that makes webfetch ask before use', async () => { webfetch: 'ask', }); }); + +test('ships a runaway guard preset with step limits for built-in agents', async () => { + const preset = resolve(process.cwd(), 'presets/agent-runaway-guard.conf'); + + const { meta, body } = await parseConf(preset); + + assert.equal(meta.name, 'agent-runaway-guard'); + assert.equal(meta.path, 'agent'); + assert.equal(meta.mode, 'merge'); + assert.deepEqual(body, { + build: { + steps: 50, + }, + plan: { + steps: 20, + }, + general: { + steps: 15, + }, + explore: { + steps: 10, + }, + scout: { + steps: 10, + }, + }); +});