diff options
| author | Arya Gummadi <[email protected]> | 2025-08-12 15:10:22 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-12 22:10:22 +0000 |
| commit | 8d6eb8c322890b5cdf20d4a30dd17afb1541f5aa (patch) | |
| tree | 34c8c86d69aa96405c2c1024c45cef76d1675ece /packages/cli/src/config/config.ts | |
| parent | 11377915dbf42064ed9a8d9e31b46adc565ae021 (diff) | |
feat: add --approval-mode parameter (#6024)
Co-authored-by: Jacob Richman <[email protected]>
Diffstat (limited to 'packages/cli/src/config/config.ts')
| -rw-r--r-- | packages/cli/src/config/config.ts | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index d0658e75..dd207ff2 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -57,6 +57,7 @@ export interface CliArgs { showMemoryUsage: boolean | undefined; show_memory_usage: boolean | undefined; yolo: boolean | undefined; + approvalMode: string | undefined; telemetry: boolean | undefined; checkpointing: boolean | undefined; telemetryTarget: string | undefined; @@ -147,6 +148,12 @@ export async function parseArguments(): Promise<CliArgs> { 'Automatically accept all actions (aka YOLO mode, see https://www.youtube.com/watch?v=xvFZjo5PgG0 for more details)?', default: false, }) + .option('approval-mode', { + type: 'string', + choices: ['default', 'auto_edit', 'yolo'], + description: + 'Set the approval mode: default (prompt for approval), auto_edit (auto-approve edit tools), yolo (auto-approve all tools)', + }) .option('telemetry', { type: 'boolean', description: @@ -219,6 +226,11 @@ export async function parseArguments(): Promise<CliArgs> { 'Cannot use both --prompt (-p) and --prompt-interactive (-i) together', ); } + if (argv.yolo && argv.approvalMode) { + throw new Error( + 'Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.', + ); + } return true; }), ) @@ -356,20 +368,59 @@ export async function loadCliConfig( let mcpServers = mergeMcpServers(settings, activeExtensions); const question = argv.promptInteractive || argv.prompt || ''; - const approvalMode = - argv.yolo || false ? ApprovalMode.YOLO : ApprovalMode.DEFAULT; + + // Determine approval mode with backward compatibility + let approvalMode: ApprovalMode; + if (argv.approvalMode) { + // New --approval-mode flag takes precedence + switch (argv.approvalMode) { + case 'yolo': + approvalMode = ApprovalMode.YOLO; + break; + case 'auto_edit': + approvalMode = ApprovalMode.AUTO_EDIT; + break; + case 'default': + approvalMode = ApprovalMode.DEFAULT; + break; + default: + throw new Error( + `Invalid approval mode: ${argv.approvalMode}. Valid values are: yolo, auto_edit, default`, + ); + } + } else { + // Fallback to legacy --yolo flag behavior + approvalMode = + argv.yolo || false ? ApprovalMode.YOLO : ApprovalMode.DEFAULT; + } + const interactive = !!argv.promptInteractive || (process.stdin.isTTY && question.length === 0); - // In non-interactive and non-yolo mode, exclude interactive built in tools. - const extraExcludes = - !interactive && approvalMode !== ApprovalMode.YOLO - ? [ShellTool.Name, EditTool.Name, WriteFileTool.Name] - : undefined; + // In non-interactive mode, exclude tools that require a prompt. + const extraExcludes: string[] = []; + if (!interactive) { + switch (approvalMode) { + case ApprovalMode.DEFAULT: + // In default non-interactive mode, all tools that require approval are excluded. + extraExcludes.push(ShellTool.Name, EditTool.Name, WriteFileTool.Name); + break; + case ApprovalMode.AUTO_EDIT: + // In auto-edit non-interactive mode, only tools that still require a prompt are excluded. + extraExcludes.push(ShellTool.Name); + break; + case ApprovalMode.YOLO: + // No extra excludes for YOLO mode. + break; + default: + // This should never happen due to validation earlier, but satisfies the linter + break; + } + } const excludeTools = mergeExcludeTools( settings, activeExtensions, - extraExcludes, + extraExcludes.length > 0 ? extraExcludes : undefined, ); const blockedMcpServers: Array<{ name: string; extensionName: string }> = []; |
