|
1 | 1 | import { describe, expect, it } from "vitest"; |
2 | | -import { buildClaudeExecutionPermissionArgs, buildClaudeProbePermissionArgs } from "./permissions.js"; |
3 | | - |
4 | | -const SANDBOX_ALLOWED_TOOLS = |
5 | | - "Task AskUserQuestion Bash CronCreate CronDelete CronList Edit " + |
6 | | - "EnterPlanMode EnterWorktree ExitPlanMode ExitWorktree Glob Grep Monitor " + |
7 | | - "NotebookEdit PushNotification Read RemoteTrigger ScheduleWakeup Skill " + |
8 | | - "TaskOutput TaskStop TodoWrite ToolSearch WebFetch WebSearch Write"; |
9 | | - |
10 | | -describe("claude-local remote permission args", () => { |
11 | | - it("uses the canonical Bash tool grant for remote execution", () => { |
12 | | - expect(buildClaudeExecutionPermissionArgs({ dangerouslySkipPermissions: true, targetIsRemote: true })).toEqual([ |
13 | | - "--allowedTools", |
14 | | - SANDBOX_ALLOWED_TOOLS, |
15 | | - ]); |
16 | | - }); |
17 | | - |
18 | | - it("uses the canonical Bash tool grant for remote probes", () => { |
19 | | - expect(buildClaudeProbePermissionArgs({ dangerouslySkipPermissions: true, targetIsRemote: true })).toEqual([ |
20 | | - "--allowedTools", |
21 | | - SANDBOX_ALLOWED_TOOLS, |
22 | | - ]); |
23 | | - }); |
24 | | - |
25 | | - it("does not use Bash(*) because Claude Code treats Bash grants as command-prefix patterns", () => { |
26 | | - const [, allowedTools] = buildClaudeExecutionPermissionArgs({ |
27 | | - dangerouslySkipPermissions: true, |
28 | | - targetIsRemote: true, |
| 2 | +import { buildClaudeExecutionPermissionArgs, buildClaudeProbePermissionArgs, claudeSandboxPermissionEnv } from "./permissions.js"; |
| 3 | + |
| 4 | +describe("Claude full-auto permission args", () => { |
| 5 | + for (const [name, build] of [["execution", buildClaudeExecutionPermissionArgs], ["probe", buildClaudeProbePermissionArgs]] as const) { |
| 6 | + it.each([ |
| 7 | + { targetIsRemote: false, localProcessUid: 1000 }, |
| 8 | + { targetIsRemote: true, localProcessUid: 1000 }, |
| 9 | + { targetIsRemote: false, localProcessUid: 0 }, |
| 10 | + { targetIsRemote: true, localProcessUid: 0 }, |
| 11 | + ])(`${name} requests full bypass for %j`, (target) => { |
| 12 | + expect(build({ ...target, dangerouslySkipPermissions: true })) |
| 13 | + .toEqual(["--dangerously-skip-permissions"]); |
| 14 | + expect(build({ ...target, dangerouslySkipPermissions: false })).toEqual([]); |
29 | 15 | }); |
| 16 | + } |
30 | 17 |
|
31 | | - expect(allowedTools.split(" ")).toContain("Bash"); |
32 | | - expect(allowedTools).not.toContain("Bash(*)"); |
33 | | - }); |
34 | | - |
35 | | - it("does not pass permission flags when skip-permissions is disabled", () => { |
36 | | - expect(buildClaudeExecutionPermissionArgs({ dangerouslySkipPermissions: false, targetIsRemote: true })).toEqual([]); |
37 | | - expect(buildClaudeProbePermissionArgs({ dangerouslySkipPermissions: false, targetIsRemote: true })).toEqual([]); |
38 | | - }); |
39 | | - |
40 | | - it("uses dangerously-skip-permissions for non-root local execution", () => { |
41 | | - expect( |
42 | | - buildClaudeExecutionPermissionArgs({ |
43 | | - dangerouslySkipPermissions: true, |
44 | | - targetIsRemote: false, |
45 | | - localProcessUid: 1000, |
46 | | - }), |
47 | | - ).toEqual(["--dangerously-skip-permissions"]); |
48 | | - }); |
49 | | - |
50 | | - it("uses dangerously-skip-permissions for non-root local probes", () => { |
51 | | - expect( |
52 | | - buildClaudeProbePermissionArgs({ |
53 | | - dangerouslySkipPermissions: true, |
54 | | - targetIsRemote: false, |
55 | | - localProcessUid: 1000, |
56 | | - }), |
57 | | - ).toEqual(["--dangerously-skip-permissions"]); |
58 | | - }); |
59 | | - |
60 | | - it("uses allowedTools for local root execution because Claude refuses dangerously-skip-permissions as root", () => { |
61 | | - expect( |
62 | | - buildClaudeExecutionPermissionArgs({ |
63 | | - dangerouslySkipPermissions: true, |
64 | | - targetIsRemote: false, |
65 | | - localProcessUid: 0, |
66 | | - }), |
67 | | - ).toEqual(["--allowedTools", SANDBOX_ALLOWED_TOOLS]); |
68 | | - }); |
69 | | - |
70 | | - it("uses allowedTools for local root probes because Claude refuses dangerously-skip-permissions as root", () => { |
71 | | - expect( |
72 | | - buildClaudeProbePermissionArgs({ |
73 | | - dangerouslySkipPermissions: true, |
74 | | - targetIsRemote: false, |
75 | | - localProcessUid: 0, |
76 | | - }), |
77 | | - ).toEqual(["--allowedTools", SANDBOX_ALLOWED_TOOLS]); |
| 18 | + it("identifies managed sandboxes for Claude's root launch check only when full auto is enabled", () => { |
| 19 | + expect(claudeSandboxPermissionEnv({ dangerouslySkipPermissions: true, targetIsSandbox: true })).toEqual({ IS_SANDBOX: "1" }); |
| 20 | + expect(claudeSandboxPermissionEnv({ dangerouslySkipPermissions: false, targetIsSandbox: true })).toEqual({}); |
| 21 | + expect(claudeSandboxPermissionEnv({ dangerouslySkipPermissions: true, targetIsSandbox: false })).toEqual({}); |
78 | 22 | }); |
79 | 23 | }); |
0 commit comments