diff options
| author | Aiden Cline <[email protected]> | 2026-01-01 17:27:23 -0600 |
|---|---|---|
| committer | Aiden Cline <[email protected]> | 2026-01-01 17:27:23 -0600 |
| commit | 76186d19f3d45134ce5d2fac5959e1b02aadbb21 (patch) | |
| tree | 6de274b4d11b9944e4f2da71a2a574f46e103aae | |
| parent | 7760b33956b719ac58a4b97a78804e8b824487d5 (diff) | |
| download | opencode-76186d19f3d45134ce5d2fac5959e1b02aadbb21.tar.gz opencode-76186d19f3d45134ce5d2fac5959e1b02aadbb21.zip | |
fix: ensure new permissions changes work for special case bash commands like rm, cd, etc
| -rw-r--r-- | packages/opencode/src/tool/bash.ts | 2 | ||||
| -rw-r--r-- | packages/opencode/test/tool/bash.test.ts | 30 |
2 files changed, 31 insertions, 1 deletions
diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index 6671c939c..46058b665 100644 --- a/packages/opencode/src/tool/bash.ts +++ b/packages/opencode/src/tool/bash.ts @@ -119,7 +119,7 @@ export const BashTool = Tool.define("bash", async () => { process.platform === "win32" && resolved.match(/^\/[a-z]\//) ? resolved.replace(/^\/([a-z])\//, (_, drive) => `${drive.toUpperCase()}:\\`).replace(/\//g, "\\") : resolved - directories.add(normalized) + if (!Filesystem.contains(Instance.directory, normalized)) directories.add(normalized) } } } diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts index ee82813fb..2eb17a9fc 100644 --- a/packages/opencode/test/tool/bash.test.ts +++ b/packages/opencode/test/tool/bash.test.ts @@ -147,6 +147,36 @@ describe("tool.bash permissions", () => { }) }) + test("does not ask for external_directory permission when rm inside project", async () => { + await using tmp = await tmpdir({ git: true }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const bash = await BashTool.init() + const requests: Array<Omit<PermissionNext.Request, "id" | "sessionID" | "tool">> = [] + const testCtx = { + ...ctx, + ask: async (req: Omit<PermissionNext.Request, "id" | "sessionID" | "tool">) => { + requests.push(req) + }, + } + + await Bun.write(path.join(tmp.path, "tmpfile"), "x") + + await bash.execute( + { + command: "rm tmpfile", + description: "Remove tmpfile", + }, + testCtx, + ) + + const extDirReq = requests.find((r) => r.permission === "external_directory") + expect(extDirReq).toBeUndefined() + }, + }) + }) + test("includes always patterns for auto-approval", async () => { await using tmp = await tmpdir({ git: true }) await Instance.provide({ |
