(workflowData *WorkflowData, markdownPath string)
| 146 | } |
| 147 | |
| 148 | func (c *Compiler) validateCoreToolConfiguration(workflowData *WorkflowData, markdownPath string) error { |
| 149 | validations := []struct { |
| 150 | logMessage string |
| 151 | validateFn func() error |
| 152 | }{ |
| 153 | {logMessage: "Validating sandbox configuration", validateFn: func() error { return validateSandboxConfig(workflowData) }}, |
| 154 | {logMessage: "Validating safe-outputs target fields", validateFn: func() error { return validateSafeOutputsTarget(workflowData.SafeOutputs) }}, |
| 155 | {logMessage: "Validating safe-outputs max fields", validateFn: func() error { return validateSafeOutputsMax(workflowData.SafeOutputs) }}, |
| 156 | {logMessage: "Validating safe-outputs samples entries against MCP tool schemas", validateFn: func() error { return validateSafeOutputsSamples(workflowData.SafeOutputs) }}, |
| 157 | {logMessage: "Validating safe-outputs urls policy", validateFn: func() error { return validateSafeOutputsURLs(workflowData.SafeOutputs) }}, |
| 158 | {logMessage: "Validating safe-outputs allowed-domains", validateFn: func() error { return c.validateSafeOutputsAllowedDomains(workflowData.SafeOutputs) }}, |
| 159 | {logMessage: "Validating safe-outputs merge-pull-request", validateFn: func() error { return validateSafeOutputsMergePullRequest(workflowData.SafeOutputs) }}, |
| 160 | {logMessage: "Validating safe-outputs needs declarations", validateFn: func() error { return validateSafeOutputsNeeds(workflowData) }}, |
| 161 | {logMessage: "Validating on.needs declarations", validateFn: func() error { return c.validateOnNeeds(workflowData) }}, |
| 162 | {logMessage: "Validating safe-job needs declarations", validateFn: func() error { return validateSafeJobNeeds(workflowData) }}, |
| 163 | {logMessage: "Validating safe-outputs allowed-labels glob scope", validateFn: func() error { return c.validateSafeOutputsAllowedLabelsGlobScope(workflowData.SafeOutputs) }}, |
| 164 | {logMessage: "Validating network allowed domains", validateFn: func() error { return c.validateNetworkAllowedDomains(workflowData.NetworkPermissions) }}, |
| 165 | {logMessage: "Validating network firewall configuration", validateFn: func() error { return validateNetworkFirewallConfig(workflowData.NetworkPermissions) }}, |
| 166 | {logMessage: "Validating safe-outputs allow-workflows", validateFn: func() error { return validateSafeOutputsAllowWorkflows(workflowData.SafeOutputs) }}, |
| 167 | {logMessage: "Validating OTLP resource attributes", validateFn: func() error { return validateOTLPResourceAttributes(workflowData) }}, |
| 168 | {logMessage: "Validating labels", validateFn: func() error { return validateLabels(workflowData) }}, |
| 169 | {logMessage: "Validating workflow_dispatch input requirements for command triggers", validateFn: func() error { return validateCommandWorkflowDispatchInputs(workflowData) }}, |
| 170 | {logMessage: "Validating max-daily-ai-credits frontmatter", validateFn: func() error { return validateMaxDailyAICFrontmatter(workflowData) }}, |
| 171 | } |
| 172 | // This validation is intentionally outside the table below because strict mode |
| 173 | // turns the same validation result into either an error or a warning. |
| 174 | workflowLog.Printf("Validating safe-outputs steps for shell expansion patterns") |
| 175 | if err := validateSafeOutputsStepsShellExpansion(workflowData.SafeOutputs); err != nil { |
| 176 | if c.strictMode { |
| 177 | return formatCompilerError(markdownPath, "error", err.Error(), err) |
| 178 | } |
| 179 | fmt.Fprintln(os.Stderr, formatCompilerMessage(markdownPath, "warning", err.Error())) |
| 180 | c.IncrementWarningCount() |
| 181 | } |
| 182 | workflowLog.Printf("Validating cross-repo checkout paths") |
| 183 | c.deriveAndWarnCrossRepoCheckoutPaths(workflowData.CheckoutConfigs, markdownPath) |
| 184 | workflowLog.Printf("Validating push-to-pull-request-branch configuration") |
| 185 | c.validatePushToPullRequestBranchWarnings(workflowData.SafeOutputs, workflowData.CheckoutConfigs) |
| 186 | for _, validation := range validations { |
| 187 | workflowLog.Printf("%s", validation.logMessage) |
| 188 | if err := validation.validateFn(); err != nil { |
| 189 | return formatCompilerError(markdownPath, "error", err.Error(), err) |
| 190 | } |
| 191 | } |
| 192 | return nil |
| 193 | } |
| 194 | |
| 195 | func (c *Compiler) validateThreatDetectionSandboxRequirement(workflowData *WorkflowData, markdownPath string) error { |
| 196 | if workflowData.SafeOutputs != nil && workflowData.SafeOutputs.ThreatDetection != nil && isAgentSandboxDisabled(workflowData) { |
no test coverage detected