summaryrefslogtreecommitdiff
path: root/packages/cli/src/config/config.ts
diff options
context:
space:
mode:
authorArya Gummadi <[email protected]>2025-08-12 15:10:22 -0700
committerGitHub <[email protected]>2025-08-12 22:10:22 +0000
commit8d6eb8c322890b5cdf20d4a30dd17afb1541f5aa (patch)
tree34c8c86d69aa96405c2c1024c45cef76d1675ece /packages/cli/src/config/config.ts
parent11377915dbf42064ed9a8d9e31b46adc565ae021 (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.ts67
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 }> = [];