Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/core/src/evaluation/providers/claude-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,10 @@ export class ClaudeCliProvider implements Provider {
'--verbose',
];

if (this.config.bypassPermissions !== false) {
args.push('--dangerously-skip-permissions');
}

if (this.config.model) {
args.push('--model', this.config.model);
}
Expand Down
8 changes: 8 additions & 0 deletions packages/core/src/evaluation/providers/targets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,8 @@ export interface ClaudeResolvedConfig {
readonly logFormat?: 'summary' | 'json';
/** New stream_log field. false=no stream log (default), 'raw'=per-event, 'summary'=consolidated. */
readonly streamLog?: false | 'raw' | 'summary';
/** When true (default), passes --dangerously-skip-permissions to the Claude CLI. Matches ClaudeSdkProvider behavior. */
readonly bypassPermissions?: boolean;
}

export interface MockResolvedConfig {
Expand Down Expand Up @@ -1853,6 +1855,11 @@ function resolveClaudeConfig(
const maxBudgetUsd =
typeof target.max_budget_usd === 'number' ? target.max_budget_usd : undefined;

const bypassPermissions =
target.bypass_permissions !== undefined
? resolveOptionalBoolean(target.bypass_permissions)
: undefined;

return {
executable,
model,
Expand All @@ -1864,6 +1871,7 @@ function resolveClaudeConfig(
logDir,
logFormat,
streamLog: streamLogResult.streamLog,
bypassPermissions,
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ClaudeProvider } from '../../../src/evaluation/providers/claude.js';
import { createBuiltinProviderRegistry } from '../../../src/evaluation/providers/index.js';

const mockClaudeConfig = {
executable: 'claude',
model: undefined,
cwd: undefined,
timeoutMs: undefined,
Expand Down Expand Up @@ -61,3 +62,32 @@ describe('Claude provider alias resolution', () => {
expect(sdkProvider.kind).toBe('claude');
});
});

describe('ClaudeCliProvider buildArgs', () => {
it('includes --dangerously-skip-permissions by default', () => {
const provider = new ClaudeCliProvider('target', mockClaudeConfig);
// biome-ignore lint/suspicious/noExplicitAny: testing private method
const args: string[] = (provider as any).buildArgs();
expect(args).toContain('--dangerously-skip-permissions');
});

it('includes --dangerously-skip-permissions when bypassPermissions is true', () => {
const provider = new ClaudeCliProvider('target', {
...mockClaudeConfig,
bypassPermissions: true,
});
// biome-ignore lint/suspicious/noExplicitAny: testing private method
const args: string[] = (provider as any).buildArgs();
expect(args).toContain('--dangerously-skip-permissions');
});

it('omits --dangerously-skip-permissions when bypassPermissions is false', () => {
const provider = new ClaudeCliProvider('target', {
...mockClaudeConfig,
bypassPermissions: false,
});
// biome-ignore lint/suspicious/noExplicitAny: testing private method
const args: string[] = (provider as any).buildArgs();
expect(args).not.toContain('--dangerously-skip-permissions');
});
});
Loading