Skip to content

Commit c0d3af7

Browse files
qozleclaude
andcommitted
fix: extract --max-turns from claude_args for SDK turn limit
The SDK enforces its own maxTurns counter independently of CLI flags. When --max-turns is passed via claude_args, it lands in extraArgs and reaches the CLI, but the SDK cuts off execution at its own default (10) before the CLI can act on it. Extract --max-turns from extraArgs into sdkOptions.maxTurns, following the same pattern used for allowedTools and disallowedTools. The direct max_turns input takes precedence when both are set. Fixes #1177 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 035417e commit c0d3af7

1 file changed

Lines changed: 9 additions & 1 deletion

File tree

base-action/src/parse-sdk-options.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,19 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
253253
};
254254
}
255255

256+
// Extract --max-turns from extraArgs so it sets sdkOptions.maxTurns (the SDK
257+
// enforces its own turn counter, so passing it only via extraArgs doesn't work)
258+
const maxTurnsFromArgs = extraArgs["max-turns"] ?? extraArgs["maxTurns"];
259+
delete extraArgs["max-turns"];
260+
delete extraArgs["maxTurns"];
261+
const maxTurnsRaw = options.maxTurns || maxTurnsFromArgs;
262+
const maxTurns = maxTurnsRaw ? parseInt(maxTurnsRaw, 10) : undefined;
263+
256264
// Build SDK options - use merged tools from both direct options and claudeArgs
257265
const sdkOptions: SdkOptions = {
258266
// Direct options from ClaudeOptions inputs
259267
model: options.model,
260-
maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined,
268+
maxTurns: Number.isFinite(maxTurns) ? maxTurns : undefined,
261269
allowedTools:
262270
mergedAllowedTools.length > 0 ? mergedAllowedTools : undefined,
263271
disallowedTools:

0 commit comments

Comments
 (0)