diff --git a/src/claude/claudeLocal.ts b/src/claude/claudeLocal.ts index d4f7ac0b..7d079410 100644 --- a/src/claude/claudeLocal.ts +++ b/src/claude/claudeLocal.ts @@ -199,17 +199,20 @@ export async function claudeLocal(opts: { args.push('--allowedTools', opts.allowedTools.join(',')); } - // Add custom Claude arguments - if (opts.claudeArgs) { - args.push(...opts.claudeArgs) - } - // Add hook settings for session tracking (when available) + // IMPORTANT: This must come BEFORE claudeArgs so that positional arguments + // (like prompts) in claudeArgs are placed at the end if (opts.hookSettingsPath) { args.push('--settings', opts.hookSettingsPath); logger.debug(`[ClaudeLocal] Using hook settings: ${opts.hookSettingsPath}`); } + // Add custom Claude arguments + // These go LAST so positional arguments (prompts) are at the end + if (opts.claudeArgs) { + args.push(...opts.claudeArgs) + } + if (!claudeCliPath || !existsSync(claudeCliPath)) { throw new Error('Claude local launcher not found. Please ensure HAPPY_PROJECT_ROOT is set correctly for development.'); } diff --git a/src/index.ts b/src/index.ts index c7ec6b15..4bbeae9a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -513,6 +513,15 @@ ${chalk.bold('To clean up runaway processes:')} Use ${chalk.cyan('happy doctor c console.error(chalk.red(`Invalid --claude-env format: ${envArg}. Expected KEY=VALUE`)) process.exit(1) } + } else if (arg === '--claude-arg') { + // Pass specific argument to Claude CLI + if (i + 1 >= args.length) { + console.error(chalk.red(`Missing value for --claude-arg`)) + process.exit(1) + } + const claudeArg = args[++i] + options.claudeArgs = options.claudeArgs || [] + options.claudeArgs.push(claudeArg) } else { // Pass unknown arguments through to claude unknownArgs.push(arg)