fix: enforce max turns from claude args (#1607)

This commit is contained in:
ulofiai
2026-08-07 07:55:06 -07:00
committed by GitHub
parent 1623c36729
commit 6ef6450f51
4 changed files with 111 additions and 1 deletions
+8 -1
View File
@@ -204,6 +204,9 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
const modelFromClaudeArgs = extraArgs["model"] || undefined;
delete extraArgs["model"];
const maxTurnsFromClaudeArgs = extraArgs["max-turns"] || undefined;
delete extraArgs["max-turns"];
const additionalDirectories = extraArgs["add-dir"]
? extraArgs["add-dir"]
.split(ACCUMULATE_DELIMITER)
@@ -308,7 +311,11 @@ export function parseSdkOptions(options: ClaudeOptions): ParsedSdkOptions {
const sdkOptions: SdkOptions = {
// Direct options from ClaudeOptions inputs
model: options.model || modelFromClaudeArgs,
maxTurns: options.maxTurns ? parseInt(options.maxTurns, 10) : undefined,
maxTurns: options.maxTurns
? parseInt(options.maxTurns, 10)
: maxTurnsFromClaudeArgs
? parseInt(maxTurnsFromClaudeArgs, 10)
: undefined,
allowedTools:
mergedAllowedTools.length > 0 ? mergedAllowedTools : undefined,
disallowedTools:
+11
View File
@@ -208,6 +208,17 @@ export async function runClaudeWithSdk(
throw new Error("No result message received from Claude");
}
if (
resultMessage.subtype === "success" &&
!resultMessage.is_error &&
sdkOptions.maxTurns !== undefined &&
resultMessage.num_turns > sdkOptions.maxTurns
) {
const message = `Claude reported a successful result after ${resultMessage.num_turns} turns, exceeding the configured maximum of ${sdkOptions.maxTurns}`;
core.error(message);
throw new Error(message);
}
// subtype "success" with is_error:true means the run errored without producing
// a real result — treat it as failure so CI does not show a misleading green check.
const isSuccess =