Skip to content
This repository was archived by the owner on Feb 14, 2026. It is now read-only.

Commit 40ff9ce

Browse files
AndyWendtclaude
andcommitted
fix: set permissionMode when --yolo flag is used
The --yolo flag only passed --dangerously-skip-permissions to Claude CLI but did not set options.permissionMode internally. This caused the PermissionHandler to stay in "default" mode for remote/mobile sessions, resulting in permission prompts even when yolo mode was selected. Additionally, when the CLI is started with --yolo, messages from the mobile app with permissionMode: "default" would override the CLI's setting. Now the CLI's explicit mode is preserved unless the mobile explicitly chooses a different mode. Fixes slopus/happy#206 Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 6bebc6b commit 40ff9ce

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

src/claude/runClaude.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ export async function runClaude(credentials: Credentials, options: StartOptions
241241
// Forward messages to the queue
242242
// Permission modes: Use the unified 7-mode type, mapping happens at SDK boundary in claudeRemote.ts
243243
let currentPermissionMode: PermissionMode | undefined = options.permissionMode;
244+
const cliPermissionMode = options.permissionMode; // Remember CLI's explicit permission mode (e.g., --yolo)
244245
let currentModel = options.model; // Track current model state
245246
let currentFallbackModel: string | undefined = undefined; // Track current fallback model
246247
let currentCustomSystemPrompt: string | undefined = undefined; // Track current custom system prompt
@@ -250,11 +251,20 @@ export async function runClaude(credentials: Credentials, options: StartOptions
250251
session.onUserMessage((message) => {
251252

252253
// Resolve permission mode from meta - pass through as-is, mapping happens at SDK boundary
254+
// If CLI was started with explicit mode (e.g., --yolo), don't let "default" messages override it
253255
let messagePermissionMode: PermissionMode | undefined = currentPermissionMode;
254256
if (message.meta?.permissionMode) {
255-
messagePermissionMode = message.meta.permissionMode;
256-
currentPermissionMode = messagePermissionMode;
257-
logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
257+
const incomingMode = message.meta.permissionMode as PermissionMode;
258+
// Only override CLI's explicit mode if message has a non-default mode
259+
// This ensures --yolo persists unless mobile explicitly changes to a different mode
260+
if (cliPermissionMode && incomingMode === 'default') {
261+
messagePermissionMode = cliPermissionMode;
262+
logger.debug(`[loop] Keeping CLI permission mode (${cliPermissionMode}) instead of message's "default"`);
263+
} else {
264+
messagePermissionMode = incomingMode;
265+
currentPermissionMode = messagePermissionMode;
266+
logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
267+
}
258268
} else {
259269
logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
260270
}

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,8 @@ ${chalk.bold('To clean up runaway processes:')} Use ${chalk.cyan('happy doctor c
491491
} else if (arg === '--yolo') {
492492
// Shortcut for --dangerously-skip-permissions
493493
unknownArgs.push('--dangerously-skip-permissions')
494+
// Also set internal permissionMode for PermissionHandler (fixes #206)
495+
options.permissionMode = 'bypassPermissions'
494496
} else if (arg === '--started-by') {
495497
options.startedBy = args[++i] as 'daemon' | 'terminal'
496498
} else if (arg === '--js-runtime') {

0 commit comments

Comments
 (0)