@@ -1918,13 +1918,13 @@ func (c *Compiler) generateSafetyChecks(yaml *strings.Builder, data *WorkflowDat
19181918
19191919 // Extract workflow name for gh workflow commands
19201920 workflowName := data .Name
1921- yaml . WriteString ( fmt .Sprintf ( " WORKFLOW_NAME=\" %s\" \n " , workflowName ) )
1921+ fmt .Fprintf ( yaml , " WORKFLOW_NAME=\" %s\" \n " , workflowName )
19221922
19231923 // Add stop-time check
19241924 if data .StopTime != "" {
19251925 yaml .WriteString (" \n " )
19261926 yaml .WriteString (" # Check stop-time limit\n " )
1927- yaml . WriteString ( fmt .Sprintf ( " STOP_TIME=\" %s\" \n " , data .StopTime ) )
1927+ fmt .Fprintf ( yaml , " STOP_TIME=\" %s\" \n " , data .StopTime )
19281928 yaml .WriteString (" echo \" Checking stop-time limit: $STOP_TIME\" \n " )
19291929 yaml .WriteString (" \n " )
19301930 yaml .WriteString (" # Convert stop time to epoch seconds\n " )
@@ -2007,26 +2007,26 @@ func (c *Compiler) generateMCPSetup(yaml *strings.Builder, tools map[string]any,
20072007 if mcpConf , err := getMCPConfig (toolConfig , toolName ); err == nil {
20082008 if containerVal , hasContainer := mcpConf ["container" ]; hasContainer {
20092009 if containerStr , ok := containerVal .(string ); ok && containerStr != "" {
2010- yaml . WriteString ( fmt .Sprintf ( " echo 'Pulling %s for tool %s'\n " , containerStr , toolName ) )
2011- yaml . WriteString ( fmt .Sprintf ( " docker pull %s\n " , containerStr ) )
2010+ fmt .Fprintf ( yaml , " echo 'Pulling %s for tool %s'\n " , containerStr , toolName )
2011+ fmt .Fprintf ( yaml , " docker pull %s\n " , containerStr )
20122012 }
20132013 }
20142014 }
2015- yaml . WriteString ( fmt .Sprintf ( " echo 'Starting squid-proxy service for %s'\n " , toolName ) )
2016- yaml . WriteString ( fmt .Sprintf ( " docker compose -f docker-compose-%s.yml up -d squid-proxy\n " , toolName ) )
2015+ fmt .Fprintf ( yaml , " echo 'Starting squid-proxy service for %s'\n " , toolName )
2016+ fmt .Fprintf ( yaml , " docker compose -f docker-compose-%s.yml up -d squid-proxy\n " , toolName )
20172017
20182018 // Enforce that egress from this tool's network can only reach the Squid proxy
20192019 subnetCIDR , squidIP , _ := computeProxyNetworkParams (toolName )
2020- yaml . WriteString ( fmt .Sprintf ( " echo 'Enforcing egress to proxy for %s (subnet %s, squid %s)'\n " , toolName , subnetCIDR , squidIP ) )
2020+ fmt .Fprintf ( yaml , " echo 'Enforcing egress to proxy for %s (subnet %s, squid %s)'\n " , toolName , subnetCIDR , squidIP )
20212021 yaml .WriteString (" if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=; fi\n " )
20222022 // Accept established/related connections first (position 1)
20232023 yaml .WriteString (" $SUDO iptables -C DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || $SUDO iptables -I DOCKER-USER 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\n " )
20242024 // Accept all egress from Squid IP (position 2)
2025- yaml . WriteString ( fmt .Sprintf ( " $SUDO iptables -C DOCKER-USER -s %s -j ACCEPT 2>/dev/null || $SUDO iptables -I DOCKER-USER 2 -s %s -j ACCEPT\n " , squidIP , squidIP ) )
2025+ fmt .Fprintf ( yaml , " $SUDO iptables -C DOCKER-USER -s %s -j ACCEPT 2>/dev/null || $SUDO iptables -I DOCKER-USER 2 -s %s -j ACCEPT\n " , squidIP , squidIP )
20262026 // Allow traffic to squid:3128 from the subnet (position 3)
2027- yaml . WriteString ( fmt .Sprintf ( " $SUDO iptables -C DOCKER-USER -s %s -d %s -p tcp --dport 3128 -j ACCEPT 2>/dev/null || $SUDO iptables -I DOCKER-USER 3 -s %s -d %s -p tcp --dport 3128 -j ACCEPT\n " , subnetCIDR , squidIP , subnetCIDR , squidIP ) )
2027+ fmt .Fprintf ( yaml , " $SUDO iptables -C DOCKER-USER -s %s -d %s -p tcp --dport 3128 -j ACCEPT 2>/dev/null || $SUDO iptables -I DOCKER-USER 3 -s %s -d %s -p tcp --dport 3128 -j ACCEPT\n " , subnetCIDR , squidIP , subnetCIDR , squidIP )
20282028 // Then reject all other egress from that subnet (append to end)
2029- yaml . WriteString ( fmt .Sprintf ( " $SUDO iptables -C DOCKER-USER -s %s -j REJECT 2>/dev/null || $SUDO iptables -A DOCKER-USER -s %s -j REJECT\n " , subnetCIDR , subnetCIDR ) )
2029+ fmt .Fprintf ( yaml , " $SUDO iptables -C DOCKER-USER -s %s -j REJECT 2>/dev/null || $SUDO iptables -A DOCKER-USER -s %s -j REJECT\n " , subnetCIDR , subnetCIDR )
20302030 }
20312031 }
20322032 }
@@ -2167,8 +2167,8 @@ func (c *Compiler) generateUploadAgentLogs(yaml *strings.Builder, logFile string
21672167 yaml .WriteString (" if: always()\n " )
21682168 yaml .WriteString (" uses: actions/upload-artifact@v4\n " )
21692169 yaml .WriteString (" with:\n " )
2170- yaml . WriteString ( fmt .Sprintf ( " name: %s.log\n " , logFile ) )
2171- yaml . WriteString ( fmt .Sprintf ( " path: %s\n " , logFileFull ) )
2170+ fmt .Fprintf ( yaml , " name: %s.log\n " , logFile )
2171+ fmt .Fprintf ( yaml , " path: %s\n " , logFileFull )
21722172 yaml .WriteString (" if-no-files-found: warn\n " )
21732173}
21742174
@@ -2489,7 +2489,7 @@ func (c *Compiler) generateEngineExecutionSteps(yaml *strings.Builder, data *Wor
24892489
24902490 if executionConfig .Command != "" {
24912491 // Command-based execution (e.g., Codex)
2492- yaml . WriteString ( fmt .Sprintf ( " - name: %s\n " , executionConfig .StepName ) )
2492+ fmt .Fprintf ( yaml , " - name: %s\n " , executionConfig .StepName )
24932493 yaml .WriteString (" run: |\n " )
24942494
24952495 // Split command into lines and indent them properly
@@ -2510,7 +2510,7 @@ func (c *Compiler) generateEngineExecutionSteps(yaml *strings.Builder, data *Wor
25102510
25112511 for _ , key := range envKeys {
25122512 value := executionConfig .Environment [key ]
2513- yaml . WriteString ( fmt .Sprintf ( " %s: %s\n " , key , value ) )
2513+ fmt .Fprintf ( yaml , " %s: %s\n " , key , value )
25142514 }
25152515 // Add GITHUB_AW_OUTPUT environment variable for all engines
25162516 yaml .WriteString (" GITHUB_AW_OUTPUT: ${{ env.GITHUB_AW_OUTPUT }}\n " )
@@ -2522,9 +2522,9 @@ func (c *Compiler) generateEngineExecutionSteps(yaml *strings.Builder, data *Wor
25222522 } else if executionConfig .Action != "" {
25232523
25242524 // Add the main action step
2525- yaml . WriteString ( fmt .Sprintf ( " - name: %s\n " , executionConfig .StepName ) )
2525+ fmt .Fprintf ( yaml , " - name: %s\n " , executionConfig .StepName )
25262526 yaml .WriteString (" id: agentic_execution\n " )
2527- yaml . WriteString ( fmt .Sprintf ( " uses: %s\n " , executionConfig .Action ) )
2527+ fmt .Fprintf ( yaml , " uses: %s\n " , executionConfig .Action )
25282528 yaml .WriteString (" with:\n " )
25292529
25302530 // Add inputs in alphabetical order by key
@@ -2541,18 +2541,18 @@ func (c *Compiler) generateEngineExecutionSteps(yaml *strings.Builder, data *Wor
25412541 // Add comment listing all allowed tools for readability
25422542 comment := c .generateAllowedToolsComment (data .AllowedTools , " " )
25432543 yaml .WriteString (comment )
2544- yaml . WriteString ( fmt .Sprintf ( " %s: \" %s\" \n " , key , data .AllowedTools ) )
2544+ fmt .Fprintf ( yaml , " %s: \" %s\" \n " , key , data .AllowedTools )
25452545 }
25462546 } else if key == "timeout_minutes" {
25472547 if data .TimeoutMinutes != "" {
25482548 yaml .WriteString (" " + data .TimeoutMinutes + "\n " )
25492549 }
25502550 } else if key == "max_turns" {
25512551 if data .MaxTurns != "" {
2552- yaml . WriteString ( fmt .Sprintf ( " max_turns: %s\n " , data .MaxTurns ) )
2552+ fmt .Fprintf ( yaml , " max_turns: %s\n " , data .MaxTurns )
25532553 }
25542554 } else if value != "" {
2555- yaml . WriteString ( fmt .Sprintf ( " %s: %s\n " , key , value ) )
2555+ fmt .Fprintf ( yaml , " %s: %s\n " , key , value )
25562556 }
25572557 }
25582558 // Add environment section to pass GITHUB_AW_OUTPUT to the action for all engines
@@ -2590,30 +2590,30 @@ func (c *Compiler) generateCreateAwInfo(yaml *strings.Builder, data *WorkflowDat
25902590 } else if data .AI != "" {
25912591 engineID = data .AI
25922592 }
2593- yaml . WriteString ( fmt .Sprintf ( " engine_id: \" %s\" ,\n " , engineID ) )
2593+ fmt .Fprintf ( yaml , " engine_id: \" %s\" ,\n " , engineID )
25942594
25952595 // Engine display name
2596- yaml . WriteString ( fmt .Sprintf ( " engine_name: \" %s\" ,\n " , engine .GetDisplayName () ))
2596+ fmt .Fprintf ( yaml , " engine_name: \" %s\" ,\n " , engine .GetDisplayName ())
25972597
25982598 // Model information
25992599 model := ""
26002600 if data .EngineConfig != nil && data .EngineConfig .Model != "" {
26012601 model = data .EngineConfig .Model
26022602 }
2603- yaml . WriteString ( fmt .Sprintf ( " model: \" %s\" ,\n " , model ) )
2603+ fmt .Fprintf ( yaml , " model: \" %s\" ,\n " , model )
26042604
26052605 // Version information
26062606 version := ""
26072607 if data .EngineConfig != nil && data .EngineConfig .Version != "" {
26082608 version = data .EngineConfig .Version
26092609 }
2610- yaml . WriteString ( fmt .Sprintf ( " version: \" %s\" ,\n " , version ) )
2610+ fmt .Fprintf ( yaml , " version: \" %s\" ,\n " , version )
26112611
26122612 // Workflow information
2613- yaml . WriteString ( fmt .Sprintf ( " workflow_name: \" %s\" ,\n " , data .Name ) )
2614- yaml . WriteString ( fmt .Sprintf ( " experimental: %t,\n " , engine .IsExperimental () ))
2615- yaml . WriteString ( fmt .Sprintf ( " supports_tools_whitelist: %t,\n " , engine .SupportsToolsWhitelist () ))
2616- yaml . WriteString ( fmt .Sprintf ( " supports_http_transport: %t,\n " , engine .SupportsHTTPTransport () ))
2613+ fmt .Fprintf ( yaml , " workflow_name: \" %s\" ,\n " , data .Name )
2614+ fmt .Fprintf ( yaml , " experimental: %t,\n " , engine .IsExperimental ())
2615+ fmt .Fprintf ( yaml , " supports_tools_whitelist: %t,\n " , engine .SupportsToolsWhitelist ())
2616+ fmt .Fprintf ( yaml , " supports_http_transport: %t,\n " , engine .SupportsHTTPTransport ())
26172617
26182618 // Run metadata
26192619 yaml .WriteString (" run_id: context.runId,\n " )
@@ -2657,7 +2657,7 @@ func (c *Compiler) generateOutputCollectionStep(yaml *strings.Builder, data *Wor
26572657 if data .Output != nil && len (data .Output .AllowedDomains ) > 0 {
26582658 yaml .WriteString (" env:\n " )
26592659 domainsStr := strings .Join (data .Output .AllowedDomains , "," )
2660- yaml . WriteString ( fmt .Sprintf ( " GITHUB_AW_ALLOWED_DOMAINS: %q\n " , domainsStr ) )
2660+ fmt .Fprintf ( yaml , " GITHUB_AW_ALLOWED_DOMAINS: %q\n " , domainsStr )
26612661 }
26622662
26632663 yaml .WriteString (" with:\n " )
@@ -2679,7 +2679,7 @@ func (c *Compiler) generateOutputCollectionStep(yaml *strings.Builder, data *Wor
26792679 yaml .WriteString (" if: always() && steps.collect_output.outputs.output != ''\n " )
26802680 yaml .WriteString (" uses: actions/upload-artifact@v4\n " )
26812681 yaml .WriteString (" with:\n " )
2682- yaml . WriteString ( fmt .Sprintf ( " name: %s\n " , OutputArtifactName ) )
2682+ fmt .Fprintf ( yaml , " name: %s\n " , OutputArtifactName )
26832683 yaml .WriteString (" path: ${{ env.GITHUB_AW_OUTPUT }}\n " )
26842684 yaml .WriteString (" if-no-files-found: warn\n " )
26852685
@@ -2710,10 +2710,7 @@ func (c *Compiler) validateMaxTurnsSupport(frontmatter map[string]any, engine Ag
27102710 engineSetting , engineConfig := c .extractEngineConfig (frontmatter )
27112711 _ = engineSetting // Suppress unused variable warning
27122712
2713- hasMaxTurns := false
2714- if engineConfig != nil && engineConfig .MaxTurns != "" {
2715- hasMaxTurns = true
2716- }
2713+ hasMaxTurns := engineConfig != nil && engineConfig .MaxTurns != ""
27172714
27182715 if ! hasMaxTurns {
27192716 // No max-turns specified, no validation needed
0 commit comments