summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2026-01-01 17:27:23 -0600
committerAiden Cline <[email protected]>2026-01-01 17:27:23 -0600
commit76186d19f3d45134ce5d2fac5959e1b02aadbb21 (patch)
tree6de274b4d11b9944e4f2da71a2a574f46e103aae
parent7760b33956b719ac58a4b97a78804e8b824487d5 (diff)
downloadopencode-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.ts2
-rw-r--r--packages/opencode/test/tool/bash.test.ts30
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({