From 8268869a758b79d348282c41b54e7f166b188c93 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:16:23 +0000 Subject: [PATCH 01/15] Initial plan From 979bea79ec3a5349b658058db908b6a5398da8cc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:28:03 +0000 Subject: [PATCH 02/15] Make centralized slash-command dispatch inputs optional Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../slash_command_centralized_compile_test.go | 48 +++++++++++++++++++ pkg/workflow/tools.go | 21 ++++++++ 2 files changed, 69 insertions(+) diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index a442854bc2e..d3002d3a5ca 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -9,6 +9,7 @@ import ( "github.com/github/gh-aw/pkg/stringutil" "github.com/github/gh-aw/pkg/testutil" + "github.com/goccy/go-yaml" "github.com/stretchr/testify/require" ) @@ -84,3 +85,50 @@ tools: require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').trigger_label == 'triage'") require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').event_type == 'issues'") } + +func TestCompileWorkflow_SlashCommandCentralizedMakesDispatchInputsOptional(t *testing.T) { + tmpDir := testutil.TempDir(t, "workflow-centralized-slash-dispatch-inputs-test") + + markdownPath := filepath.Join(tmpDir, "scout.md") + content := `--- +on: + slash_command: + name: scout + strategy: centralized + workflow_dispatch: + inputs: + topic: + description: "Research topic" + required: true + type: string +tools: + github: + allowed: [list_issues] +--- + +# Scout +` + require.NoError(t, os.WriteFile(markdownPath, []byte(content), 0644)) + + compiler := NewCompiler() + require.NoError(t, compiler.CompileWorkflow(markdownPath)) + + lockPath := stringutil.MarkdownToLockFile(markdownPath) + lockContent, err := os.ReadFile(lockPath) + require.NoError(t, err) + + var workflow map[string]any + require.NoError(t, yaml.Unmarshal(lockContent, &workflow)) + + onMap, ok := workflow["on"].(map[string]any) + require.True(t, ok) + workflowDispatch, ok := onMap["workflow_dispatch"].(map[string]any) + require.True(t, ok) + inputs, ok := workflowDispatch["inputs"].(map[string]any) + require.True(t, ok) + topic, ok := inputs["topic"].(map[string]any) + require.True(t, ok) + required, ok := topic["required"].(bool) + require.True(t, ok) + require.False(t, required) +} diff --git a/pkg/workflow/tools.go b/pkg/workflow/tools.go index 58f79350a23..9bc7cf21ab4 100644 --- a/pkg/workflow/tools.go +++ b/pkg/workflow/tools.go @@ -91,6 +91,7 @@ func (c *Compiler) applyDefaults(data *WorkflowData, markdownPath string) error if len(data.CommandOtherEvents) > 0 { maps.Copy(commandEventsMap, data.CommandOtherEvents) } + setWorkflowDispatchInputsOptional(commandEventsMap) if _, hasWorkflowDispatch := commandEventsMap["workflow_dispatch"]; !hasWorkflowDispatch { commandEventsMap["workflow_dispatch"] = nil } @@ -420,6 +421,26 @@ func ensureWorkflowDispatchItemNumberInput(eventsMap map[string]any) bool { return true } +func setWorkflowDispatchInputsOptional(eventsMap map[string]any) { + dispatchMap, ok := eventsMap["workflow_dispatch"].(map[string]any) + if !ok { + return + } + + inputsMap, ok := dispatchMap["inputs"].(map[string]any) + if !ok { + return + } + + for _, inputDef := range inputsMap { + inputDefMap, ok := inputDef.(map[string]any) + if !ok { + continue + } + inputDefMap["required"] = false + } +} + // mergeToolsAndMCPServers merges tools, mcp-servers, and included tools func (c *Compiler) mergeToolsAndMCPServers(topTools, mcpServers map[string]any, includedTools string) (map[string]any, error) { toolsLog.Printf("Merging tools and MCP servers: topTools=%d, mcpServers=%d", len(topTools), len(mcpServers)) From fb65a7c9aa6bd6f0adf350b753bf0ace6b8d61ec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:29:06 +0000 Subject: [PATCH 03/15] Address review feedback on slash-command optional inputs change Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/slash_command_centralized_compile_test.go | 10 +++++----- pkg/workflow/tools.go | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index d3002d3a5ca..6107b328114 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -121,14 +121,14 @@ tools: require.NoError(t, yaml.Unmarshal(lockContent, &workflow)) onMap, ok := workflow["on"].(map[string]any) - require.True(t, ok) + require.True(t, ok, "expected 'on' to be a map") workflowDispatch, ok := onMap["workflow_dispatch"].(map[string]any) - require.True(t, ok) + require.True(t, ok, "expected 'on.workflow_dispatch' to be a map") inputs, ok := workflowDispatch["inputs"].(map[string]any) - require.True(t, ok) + require.True(t, ok, "expected 'on.workflow_dispatch.inputs' to be a map") topic, ok := inputs["topic"].(map[string]any) - require.True(t, ok) + require.True(t, ok, "expected topic input to be present in workflow_dispatch inputs") required, ok := topic["required"].(bool) - require.True(t, ok) + require.True(t, ok, "expected topic.required to be a boolean") require.False(t, required) } diff --git a/pkg/workflow/tools.go b/pkg/workflow/tools.go index 9bc7cf21ab4..52b2cfe1396 100644 --- a/pkg/workflow/tools.go +++ b/pkg/workflow/tools.go @@ -421,6 +421,9 @@ func ensureWorkflowDispatchItemNumberInput(eventsMap map[string]any) bool { return true } +// setWorkflowDispatchInputsOptional forces all workflow_dispatch inputs in the given on: map +// to required: false. This is used for centralized slash-command workflows, which are +// dispatched by the router and must not be blocked by required manual-dispatch inputs. func setWorkflowDispatchInputsOptional(eventsMap map[string]any) { dispatchMap, ok := eventsMap["workflow_dispatch"].(map[string]any) if !ok { From 40c4a8eedfbbd2faaee8e12859d074f30dc829a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:46:31 +0000 Subject: [PATCH 04/15] Reject required workflow_dispatch inputs for slash/label command triggers Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 48 +++++++++++++++++ pkg/workflow/compiler_validators.go | 6 +++ .../slash_command_centralized_compile_test.go | 51 +++++++++++-------- pkg/workflow/tools.go | 24 --------- 4 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 pkg/workflow/command_dispatch_validation.go diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go new file mode 100644 index 00000000000..80dd475a51b --- /dev/null +++ b/pkg/workflow/command_dispatch_validation.go @@ -0,0 +1,48 @@ +package workflow + +import "fmt" + +// validateCommandWorkflowDispatchInputs rejects required workflow_dispatch inputs when +// slash_command or label_command triggers are configured. +func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { + if workflowData == nil || workflowData.RawFrontmatter == nil { + return nil + } + + hasCommandTrigger := len(workflowData.Command) > 0 || len(workflowData.LabelCommand) > 0 + if !hasCommandTrigger { + return nil + } + + onMap, ok := workflowData.RawFrontmatter["on"].(map[string]any) + if !ok { + return nil + } + + workflowDispatchMap, ok := onMap["workflow_dispatch"].(map[string]any) + if !ok { + return nil + } + + inputsMap, ok := workflowDispatchMap["inputs"].(map[string]any) + if !ok { + return nil + } + + for inputName, inputDef := range inputsMap { + inputDefMap, ok := inputDef.(map[string]any) + if !ok { + continue + } + + required, ok := inputDefMap["required"].(bool) + if ok && required { + return fmt.Errorf( + "on.workflow_dispatch.inputs.%s.required: true is not allowed with slash_command or label_command; set required: false", + inputName, + ) + } + } + + return nil +} diff --git a/pkg/workflow/compiler_validators.go b/pkg/workflow/compiler_validators.go index 0c23b600ed8..0b5511335fc 100644 --- a/pkg/workflow/compiler_validators.go +++ b/pkg/workflow/compiler_validators.go @@ -185,6 +185,12 @@ func (c *Compiler) validateToolConfiguration(workflowData *WorkflowData, markdow return formatCompilerError(markdownPath, "error", err.Error(), err) } + // Validate workflow_dispatch required inputs with slash/label command triggers. + log.Printf("Validating workflow_dispatch input requirements for command triggers") + if err := validateCommandWorkflowDispatchInputs(workflowData); err != nil { + return formatCompilerError(markdownPath, "error", err.Error(), err) + } + // Validate workflow-level concurrency group expression log.Printf("Validating workflow-level concurrency configuration") if workflowData.Concurrency != "" { diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index 6107b328114..ead1c3bfa5e 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -9,7 +9,6 @@ import ( "github.com/github/gh-aw/pkg/stringutil" "github.com/github/gh-aw/pkg/testutil" - "github.com/goccy/go-yaml" "github.com/stretchr/testify/require" ) @@ -86,7 +85,7 @@ tools: require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').event_type == 'issues'") } -func TestCompileWorkflow_SlashCommandCentralizedMakesDispatchInputsOptional(t *testing.T) { +func TestCompileWorkflow_SlashCommandCentralizedRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-centralized-slash-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "scout.md") @@ -111,24 +110,36 @@ tools: require.NoError(t, os.WriteFile(markdownPath, []byte(content), 0644)) compiler := NewCompiler() - require.NoError(t, compiler.CompileWorkflow(markdownPath)) + err := compiler.CompileWorkflow(markdownPath) + require.Error(t, err) + require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed with slash_command or label_command") +} - lockPath := stringutil.MarkdownToLockFile(markdownPath) - lockContent, err := os.ReadFile(lockPath) - require.NoError(t, err) +func TestCompileWorkflow_LabelCommandRejectsRequiredDispatchInputs(t *testing.T) { + tmpDir := testutil.TempDir(t, "workflow-label-dispatch-inputs-test") + + markdownPath := filepath.Join(tmpDir, "triage.md") + content := `--- +on: + label_command: + name: triage + workflow_dispatch: + inputs: + topic: + description: "Research topic" + required: true + type: string +tools: + github: + allowed: [list_issues] +--- + +# Triage +` + require.NoError(t, os.WriteFile(markdownPath, []byte(content), 0644)) - var workflow map[string]any - require.NoError(t, yaml.Unmarshal(lockContent, &workflow)) - - onMap, ok := workflow["on"].(map[string]any) - require.True(t, ok, "expected 'on' to be a map") - workflowDispatch, ok := onMap["workflow_dispatch"].(map[string]any) - require.True(t, ok, "expected 'on.workflow_dispatch' to be a map") - inputs, ok := workflowDispatch["inputs"].(map[string]any) - require.True(t, ok, "expected 'on.workflow_dispatch.inputs' to be a map") - topic, ok := inputs["topic"].(map[string]any) - require.True(t, ok, "expected topic input to be present in workflow_dispatch inputs") - required, ok := topic["required"].(bool) - require.True(t, ok, "expected topic.required to be a boolean") - require.False(t, required) + compiler := NewCompiler() + err := compiler.CompileWorkflow(markdownPath) + require.Error(t, err) + require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed with slash_command or label_command") } diff --git a/pkg/workflow/tools.go b/pkg/workflow/tools.go index 52b2cfe1396..58f79350a23 100644 --- a/pkg/workflow/tools.go +++ b/pkg/workflow/tools.go @@ -91,7 +91,6 @@ func (c *Compiler) applyDefaults(data *WorkflowData, markdownPath string) error if len(data.CommandOtherEvents) > 0 { maps.Copy(commandEventsMap, data.CommandOtherEvents) } - setWorkflowDispatchInputsOptional(commandEventsMap) if _, hasWorkflowDispatch := commandEventsMap["workflow_dispatch"]; !hasWorkflowDispatch { commandEventsMap["workflow_dispatch"] = nil } @@ -421,29 +420,6 @@ func ensureWorkflowDispatchItemNumberInput(eventsMap map[string]any) bool { return true } -// setWorkflowDispatchInputsOptional forces all workflow_dispatch inputs in the given on: map -// to required: false. This is used for centralized slash-command workflows, which are -// dispatched by the router and must not be blocked by required manual-dispatch inputs. -func setWorkflowDispatchInputsOptional(eventsMap map[string]any) { - dispatchMap, ok := eventsMap["workflow_dispatch"].(map[string]any) - if !ok { - return - } - - inputsMap, ok := dispatchMap["inputs"].(map[string]any) - if !ok { - return - } - - for _, inputDef := range inputsMap { - inputDefMap, ok := inputDef.(map[string]any) - if !ok { - continue - } - inputDefMap["required"] = false - } -} - // mergeToolsAndMCPServers merges tools, mcp-servers, and included tools func (c *Compiler) mergeToolsAndMCPServers(topTools, mcpServers map[string]any, includedTools string) (map[string]any, error) { toolsLog.Printf("Merging tools and MCP servers: topTools=%d, mcpServers=%d", len(topTools), len(mcpServers)) From 7ea71b93ae6a82d04760e4588664e1755a83bd38 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:48:34 +0000 Subject: [PATCH 05/15] Refine command-trigger dispatch input validation diagnostics Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 19 +++++++++++++++---- .../slash_command_centralized_compile_test.go | 4 ++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index 80dd475a51b..329d16a495b 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -9,8 +9,10 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { return nil } - hasCommandTrigger := len(workflowData.Command) > 0 || len(workflowData.LabelCommand) > 0 - if !hasCommandTrigger { + hasSlashCommand := len(workflowData.Command) > 0 + hasLabelCommand := len(workflowData.LabelCommand) > 0 + hasSlashOrLabelCommand := hasSlashCommand || hasLabelCommand + if !hasSlashOrLabelCommand { return nil } @@ -37,9 +39,18 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { required, ok := inputDefMap["required"].(bool) if ok && required { + triggerName := "slash_command or label_command" + if hasSlashCommand && hasLabelCommand { + triggerName = "slash_command and label_command" + } else if hasSlashCommand { + triggerName = "slash_command" + } else if hasLabelCommand { + triggerName = "label_command" + } + return fmt.Errorf( - "on.workflow_dispatch.inputs.%s.required: true is not allowed with slash_command or label_command; set required: false", - inputName, + "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; set required: false", + inputName, triggerName, ) } } diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index ead1c3bfa5e..c64b12e468e 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -112,7 +112,7 @@ tools: compiler := NewCompiler() err := compiler.CompileWorkflow(markdownPath) require.Error(t, err) - require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed with slash_command or label_command") + require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed when using slash_command") } func TestCompileWorkflow_LabelCommandRejectsRequiredDispatchInputs(t *testing.T) { @@ -141,5 +141,5 @@ tools: compiler := NewCompiler() err := compiler.CompileWorkflow(markdownPath) require.Error(t, err) - require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed with slash_command or label_command") + require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed when using label_command") } From 0400ef3fa21e054e932f7fd29778337bd2608967 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:50:27 +0000 Subject: [PATCH 06/15] Polish dispatch-validation diagnostics and test naming Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 4 ++-- pkg/workflow/slash_command_centralized_compile_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index 329d16a495b..a8e52e8b907 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -39,12 +39,12 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { required, ok := inputDefMap["required"].(bool) if ok && required { - triggerName := "slash_command or label_command" + var triggerName string if hasSlashCommand && hasLabelCommand { triggerName = "slash_command and label_command" } else if hasSlashCommand { triggerName = "slash_command" - } else if hasLabelCommand { + } else { triggerName = "label_command" } diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index c64b12e468e..19da99e3861 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -85,7 +85,7 @@ tools: require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').event_type == 'issues'") } -func TestCompileWorkflow_SlashCommandCentralizedRejectsRequiredDispatchInputs(t *testing.T) { +func TestCompileWorkflow_SlashCommandRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-centralized-slash-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "scout.md") From aeaf54202b987bbe4f26810824fec7b8e0fd2480 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:52:11 +0000 Subject: [PATCH 07/15] Simplify trigger-name formatting in dispatch validation Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index a8e52e8b907..a2bc018a238 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -1,6 +1,7 @@ package workflow import "fmt" +import "strings" // validateCommandWorkflowDispatchInputs rejects required workflow_dispatch inputs when // slash_command or label_command triggers are configured. @@ -39,14 +40,14 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { required, ok := inputDefMap["required"].(bool) if ok && required { - var triggerName string - if hasSlashCommand && hasLabelCommand { - triggerName = "slash_command and label_command" - } else if hasSlashCommand { - triggerName = "slash_command" - } else { - triggerName = "label_command" + var triggerNames []string + if hasSlashCommand { + triggerNames = append(triggerNames, "slash_command") } + if hasLabelCommand { + triggerNames = append(triggerNames, "label_command") + } + triggerName := strings.Join(triggerNames, " and ") return fmt.Errorf( "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; set required: false", From fec8d8c64807c2ae0d6f8348090d849b3e757f6b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:53:56 +0000 Subject: [PATCH 08/15] Apply final review nits in command dispatch validation Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index a2bc018a238..1a488114d28 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -1,7 +1,9 @@ package workflow -import "fmt" -import "strings" +import ( + "fmt" + "strings" +) // validateCommandWorkflowDispatchInputs rejects required workflow_dispatch inputs when // slash_command or label_command triggers are configured. @@ -47,11 +49,11 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { if hasLabelCommand { triggerNames = append(triggerNames, "label_command") } - triggerName := strings.Join(triggerNames, " and ") + triggersPhrase := strings.Join(triggerNames, " and ") return fmt.Errorf( "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; set required: false", - inputName, triggerName, + inputName, triggersPhrase, ) } } From b57bf678a11e037f4716f6a26aaa00d1b6b1626f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:55:42 +0000 Subject: [PATCH 09/15] Inline trigger presence check in dispatch validator Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index 1a488114d28..a79a93add28 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -14,8 +14,7 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { hasSlashCommand := len(workflowData.Command) > 0 hasLabelCommand := len(workflowData.LabelCommand) > 0 - hasSlashOrLabelCommand := hasSlashCommand || hasLabelCommand - if !hasSlashOrLabelCommand { + if !hasSlashCommand && !hasLabelCommand { return nil } From 1f2ac3ed6f3dd7eb24633170574f3a575d610c16 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:57:34 +0000 Subject: [PATCH 10/15] Rename dispatch input rejection tests for clarity Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/slash_command_centralized_compile_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index 19da99e3861..5b43afd6c5d 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -85,7 +85,7 @@ tools: require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').event_type == 'issues'") } -func TestCompileWorkflow_SlashCommandRejectsRequiredDispatchInputs(t *testing.T) { +func TestSlashCommandRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-centralized-slash-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "scout.md") @@ -115,7 +115,7 @@ tools: require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed when using slash_command") } -func TestCompileWorkflow_LabelCommandRejectsRequiredDispatchInputs(t *testing.T) { +func TestLabelCommandRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-label-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "triage.md") From a7f05563d93d6189c5301d0d955f62c39bc55f74 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 21:59:29 +0000 Subject: [PATCH 11/15] Tighten dispatch validation docs and compile-failure assertions Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 5 +++-- pkg/workflow/slash_command_centralized_compile_test.go | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index a79a93add28..01b576c85e0 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -7,6 +7,7 @@ import ( // validateCommandWorkflowDispatchInputs rejects required workflow_dispatch inputs when // slash_command or label_command triggers are configured. +// Returns an error if any workflow_dispatch input has required: true. func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { if workflowData == nil || workflowData.RawFrontmatter == nil { return nil @@ -48,11 +49,11 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { if hasLabelCommand { triggerNames = append(triggerNames, "label_command") } - triggersPhrase := strings.Join(triggerNames, " and ") + triggerNamesPhrase := strings.Join(triggerNames, " and ") return fmt.Errorf( "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; set required: false", - inputName, triggersPhrase, + inputName, triggerNamesPhrase, ) } } diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index 5b43afd6c5d..8840161a4ea 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -113,6 +113,11 @@ tools: err := compiler.CompileWorkflow(markdownPath) require.Error(t, err) require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed when using slash_command") + + lockPath := stringutil.MarkdownToLockFile(markdownPath) + _, statErr := os.Stat(lockPath) + require.Error(t, statErr) + require.True(t, os.IsNotExist(statErr)) } func TestLabelCommandRejectsRequiredDispatchInputs(t *testing.T) { @@ -142,4 +147,9 @@ tools: err := compiler.CompileWorkflow(markdownPath) require.Error(t, err) require.Contains(t, err.Error(), "on.workflow_dispatch.inputs.topic.required: true is not allowed when using label_command") + + lockPath := stringutil.MarkdownToLockFile(markdownPath) + _, statErr := os.Stat(lockPath) + require.Error(t, statErr) + require.True(t, os.IsNotExist(statErr)) } From 9018f2374a7a1ce2dbeb43313e662350440c15f0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 22:01:19 +0000 Subject: [PATCH 12/15] Clarify dispatch-input error context and restore test naming convention Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 3 ++- pkg/workflow/slash_command_centralized_compile_test.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index 01b576c85e0..393901772ba 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -52,7 +52,8 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { triggerNamesPhrase := strings.Join(triggerNames, " and ") return fmt.Errorf( - "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; set required: false", + "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; "+ + "these triggers are dispatched automatically and cannot enforce required manual inputs; set required: false", inputName, triggerNamesPhrase, ) } diff --git a/pkg/workflow/slash_command_centralized_compile_test.go b/pkg/workflow/slash_command_centralized_compile_test.go index 8840161a4ea..694197dddae 100644 --- a/pkg/workflow/slash_command_centralized_compile_test.go +++ b/pkg/workflow/slash_command_centralized_compile_test.go @@ -85,7 +85,7 @@ tools: require.Contains(t, compiled, "fromJSON(github.event.inputs.aw_context || '{}').event_type == 'issues'") } -func TestSlashCommandRejectsRequiredDispatchInputs(t *testing.T) { +func TestCompileWorkflow_SlashCommandRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-centralized-slash-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "scout.md") @@ -120,7 +120,7 @@ tools: require.True(t, os.IsNotExist(statErr)) } -func TestLabelCommandRejectsRequiredDispatchInputs(t *testing.T) { +func TestCompileWorkflow_LabelCommandRejectsRequiredDispatchInputs(t *testing.T) { tmpDir := testutil.TempDir(t, "workflow-label-dispatch-inputs-test") markdownPath := filepath.Join(tmpDir, "triage.md") From a000647882b734ac82cf6999fa6ff4a74afc3732 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 22:03:03 +0000 Subject: [PATCH 13/15] Refine command-trigger dispatch validation error wording Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/command_dispatch_validation.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/workflow/command_dispatch_validation.go b/pkg/workflow/command_dispatch_validation.go index 393901772ba..26099191279 100644 --- a/pkg/workflow/command_dispatch_validation.go +++ b/pkg/workflow/command_dispatch_validation.go @@ -52,8 +52,7 @@ func validateCommandWorkflowDispatchInputs(workflowData *WorkflowData) error { triggerNamesPhrase := strings.Join(triggerNames, " and ") return fmt.Errorf( - "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; "+ - "these triggers are dispatched automatically and cannot enforce required manual inputs; set required: false", + "on.workflow_dispatch.inputs.%s.required: true is not allowed when using %s; these triggers are dispatched automatically and cannot enforce required manual inputs; set required: false in workflow_dispatch.inputs", inputName, triggerNamesPhrase, ) } From bfe68b68b7aada0ad509e1574ea52e3b3d810446 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 22:09:19 +0000 Subject: [PATCH 14/15] Plan update: investigate PR feedback and CI failures Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/agentic_commands.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/agentic_commands.yml b/.github/workflows/agentic_commands.yml index 086ace98c41..2039e860293 100644 --- a/.github/workflows/agentic_commands.yml +++ b/.github/workflows/agentic_commands.yml @@ -1,4 +1,4 @@ -# gh-aw-commands: {"payload_version":"v1","schema_version":"v1","compiler_version":"dev","commands":["ace","approach-validator","archie","brave","cloclo","craft","grumpy","mergefest","nit","plan","poem-bot","review","scout","security-review","summarize","tidy","unbloat"],"workflows":["ace-editor","approach-validator","archie","brave","ci-doctor","cloclo","craft","dev","grumpy-reviewer","mergefest","necromancer","pdf-summary","plan","poem-bot","pr-code-quality-reviewer","pr-nitpick-reviewer","scout","security-review","tidy","unbloat-docs"]} +# gh-aw-commands: {"payload_version":"v1","schema_version":"v1","compiler_version":"dev","commands":["ace","approach-validator","archie","brave","cloclo","craft","grumpy","mergefest","nit","plan","poem-bot","review","security-review","tidy","unbloat"],"workflows":["ace-editor","approach-validator","archie","brave","ci-doctor","cloclo","craft","dev","grumpy-reviewer","mergefest","necromancer","plan","poem-bot","pr-code-quality-reviewer","pr-nitpick-reviewer","security-review","tidy","unbloat-docs"]} # Routing summary (sorted): # slash commands: # /ace -> ace-editor [pull_request_comment] reaction=eyes @@ -13,9 +13,7 @@ # /plan -> plan [discussion_comment,issue_comment] reaction=eyes # /poem-bot -> poem-bot [issues] reaction=eyes # /review -> pr-code-quality-reviewer [pull_request_comment,pull_request_review_comment] reaction=eyes -# /scout -> scout [discussion,discussion_comment,issue_comment,issues,pull_request,pull_request_comment,pull_request_review_comment] reaction=eyes # /security-review -> security-review [pull_request_comment,pull_request_review_comment] reaction=eyes -# /summarize -> pdf-summary [issue_comment,issues] reaction=eyes # /tidy -> tidy [pull_request_comment] reaction=eyes # /unbloat -> unbloat-docs [pull_request_comment] reaction=eyes # labels: @@ -87,7 +85,7 @@ jobs: - name: Route slash command uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - GH_AW_SLASH_ROUTING: '{"ace":[{"workflow":"ace-editor","events":["pull_request_comment"],"ai_reaction":"eyes"}],"approach-validator":[{"workflow":"approach-validator","events":["issue_comment","pull_request_comment"],"ai_reaction":"eyes"}],"archie":[{"workflow":"archie","events":["issue_comment","issues","pull_request","pull_request_comment"],"ai_reaction":"eyes"}],"brave":[{"workflow":"brave","events":["issue_comment"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"craft":[{"workflow":"craft","events":["issues"],"ai_reaction":"eyes"}],"grumpy":[{"workflow":"grumpy-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"mergefest":[{"workflow":"mergefest","events":["pull_request_comment"],"ai_reaction":"eyes"}],"nit":[{"workflow":"pr-nitpick-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"plan":[{"workflow":"plan","events":["discussion_comment","issue_comment"],"ai_reaction":"eyes"}],"poem-bot":[{"workflow":"poem-bot","events":["issues"],"ai_reaction":"eyes"}],"review":[{"workflow":"pr-code-quality-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"scout":[{"workflow":"scout","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"security-review":[{"workflow":"security-review","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"summarize":[{"workflow":"pdf-summary","events":["issue_comment","issues"],"ai_reaction":"eyes"}],"tidy":[{"workflow":"tidy","events":["pull_request_comment"],"ai_reaction":"eyes"}],"unbloat":[{"workflow":"unbloat-docs","events":["pull_request_comment"],"ai_reaction":"eyes"}]}' + GH_AW_SLASH_ROUTING: '{"ace":[{"workflow":"ace-editor","events":["pull_request_comment"],"ai_reaction":"eyes"}],"approach-validator":[{"workflow":"approach-validator","events":["issue_comment","pull_request_comment"],"ai_reaction":"eyes"}],"archie":[{"workflow":"archie","events":["issue_comment","issues","pull_request","pull_request_comment"],"ai_reaction":"eyes"}],"brave":[{"workflow":"brave","events":["issue_comment"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"craft":[{"workflow":"craft","events":["issues"],"ai_reaction":"eyes"}],"grumpy":[{"workflow":"grumpy-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"mergefest":[{"workflow":"mergefest","events":["pull_request_comment"],"ai_reaction":"eyes"}],"nit":[{"workflow":"pr-nitpick-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"plan":[{"workflow":"plan","events":["discussion_comment","issue_comment"],"ai_reaction":"eyes"}],"poem-bot":[{"workflow":"poem-bot","events":["issues"],"ai_reaction":"eyes"}],"review":[{"workflow":"pr-code-quality-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"security-review":[{"workflow":"security-review","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"tidy":[{"workflow":"tidy","events":["pull_request_comment"],"ai_reaction":"eyes"}],"unbloat":[{"workflow":"unbloat-docs","events":["pull_request_comment"],"ai_reaction":"eyes"}]}' GH_AW_LABEL_ROUTING: '{"approach-proposal":[{"workflow":"approach-validator","events":["issues","pull_request"],"ai_reaction":"eyes"}],"ci-doctor":[{"workflow":"ci-doctor","events":["pull_request"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","issues","pull_request"],"ai_reaction":"eyes"}],"dev":[{"workflow":"dev","events":["discussion","issues","pull_request"],"ai_reaction":"eyes"}],"necromancer":[{"workflow":"necromancer","events":["pull_request"],"ai_reaction":"eyes"}],"needs-design":[{"workflow":"approach-validator","events":["issues","pull_request"],"ai_reaction":"eyes"}]}' with: script: | From b93490c7663a64a7afd192b09234a66c13b8c8e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 22:15:54 +0000 Subject: [PATCH 15/15] Fix command workflow_dispatch required inputs and recompile workflows Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/agentic_commands.yml | 6 ++++-- .github/workflows/pdf-summary.lock.yml | 28 +++++++++++++------------- .github/workflows/pdf-summary.md | 2 +- .github/workflows/scout.lock.yml | 28 +++++++++++++------------- .github/workflows/scout.md | 2 +- 5 files changed, 34 insertions(+), 32 deletions(-) diff --git a/.github/workflows/agentic_commands.yml b/.github/workflows/agentic_commands.yml index 2039e860293..086ace98c41 100644 --- a/.github/workflows/agentic_commands.yml +++ b/.github/workflows/agentic_commands.yml @@ -1,4 +1,4 @@ -# gh-aw-commands: {"payload_version":"v1","schema_version":"v1","compiler_version":"dev","commands":["ace","approach-validator","archie","brave","cloclo","craft","grumpy","mergefest","nit","plan","poem-bot","review","security-review","tidy","unbloat"],"workflows":["ace-editor","approach-validator","archie","brave","ci-doctor","cloclo","craft","dev","grumpy-reviewer","mergefest","necromancer","plan","poem-bot","pr-code-quality-reviewer","pr-nitpick-reviewer","security-review","tidy","unbloat-docs"]} +# gh-aw-commands: {"payload_version":"v1","schema_version":"v1","compiler_version":"dev","commands":["ace","approach-validator","archie","brave","cloclo","craft","grumpy","mergefest","nit","plan","poem-bot","review","scout","security-review","summarize","tidy","unbloat"],"workflows":["ace-editor","approach-validator","archie","brave","ci-doctor","cloclo","craft","dev","grumpy-reviewer","mergefest","necromancer","pdf-summary","plan","poem-bot","pr-code-quality-reviewer","pr-nitpick-reviewer","scout","security-review","tidy","unbloat-docs"]} # Routing summary (sorted): # slash commands: # /ace -> ace-editor [pull_request_comment] reaction=eyes @@ -13,7 +13,9 @@ # /plan -> plan [discussion_comment,issue_comment] reaction=eyes # /poem-bot -> poem-bot [issues] reaction=eyes # /review -> pr-code-quality-reviewer [pull_request_comment,pull_request_review_comment] reaction=eyes +# /scout -> scout [discussion,discussion_comment,issue_comment,issues,pull_request,pull_request_comment,pull_request_review_comment] reaction=eyes # /security-review -> security-review [pull_request_comment,pull_request_review_comment] reaction=eyes +# /summarize -> pdf-summary [issue_comment,issues] reaction=eyes # /tidy -> tidy [pull_request_comment] reaction=eyes # /unbloat -> unbloat-docs [pull_request_comment] reaction=eyes # labels: @@ -85,7 +87,7 @@ jobs: - name: Route slash command uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 env: - GH_AW_SLASH_ROUTING: '{"ace":[{"workflow":"ace-editor","events":["pull_request_comment"],"ai_reaction":"eyes"}],"approach-validator":[{"workflow":"approach-validator","events":["issue_comment","pull_request_comment"],"ai_reaction":"eyes"}],"archie":[{"workflow":"archie","events":["issue_comment","issues","pull_request","pull_request_comment"],"ai_reaction":"eyes"}],"brave":[{"workflow":"brave","events":["issue_comment"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"craft":[{"workflow":"craft","events":["issues"],"ai_reaction":"eyes"}],"grumpy":[{"workflow":"grumpy-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"mergefest":[{"workflow":"mergefest","events":["pull_request_comment"],"ai_reaction":"eyes"}],"nit":[{"workflow":"pr-nitpick-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"plan":[{"workflow":"plan","events":["discussion_comment","issue_comment"],"ai_reaction":"eyes"}],"poem-bot":[{"workflow":"poem-bot","events":["issues"],"ai_reaction":"eyes"}],"review":[{"workflow":"pr-code-quality-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"security-review":[{"workflow":"security-review","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"tidy":[{"workflow":"tidy","events":["pull_request_comment"],"ai_reaction":"eyes"}],"unbloat":[{"workflow":"unbloat-docs","events":["pull_request_comment"],"ai_reaction":"eyes"}]}' + GH_AW_SLASH_ROUTING: '{"ace":[{"workflow":"ace-editor","events":["pull_request_comment"],"ai_reaction":"eyes"}],"approach-validator":[{"workflow":"approach-validator","events":["issue_comment","pull_request_comment"],"ai_reaction":"eyes"}],"archie":[{"workflow":"archie","events":["issue_comment","issues","pull_request","pull_request_comment"],"ai_reaction":"eyes"}],"brave":[{"workflow":"brave","events":["issue_comment"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"craft":[{"workflow":"craft","events":["issues"],"ai_reaction":"eyes"}],"grumpy":[{"workflow":"grumpy-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"mergefest":[{"workflow":"mergefest","events":["pull_request_comment"],"ai_reaction":"eyes"}],"nit":[{"workflow":"pr-nitpick-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"plan":[{"workflow":"plan","events":["discussion_comment","issue_comment"],"ai_reaction":"eyes"}],"poem-bot":[{"workflow":"poem-bot","events":["issues"],"ai_reaction":"eyes"}],"review":[{"workflow":"pr-code-quality-reviewer","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"scout":[{"workflow":"scout","events":["discussion","discussion_comment","issue_comment","issues","pull_request","pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"security-review":[{"workflow":"security-review","events":["pull_request_comment","pull_request_review_comment"],"ai_reaction":"eyes"}],"summarize":[{"workflow":"pdf-summary","events":["issue_comment","issues"],"ai_reaction":"eyes"}],"tidy":[{"workflow":"tidy","events":["pull_request_comment"],"ai_reaction":"eyes"}],"unbloat":[{"workflow":"unbloat-docs","events":["pull_request_comment"],"ai_reaction":"eyes"}]}' GH_AW_LABEL_ROUTING: '{"approach-proposal":[{"workflow":"approach-validator","events":["issues","pull_request"],"ai_reaction":"eyes"}],"ci-doctor":[{"workflow":"ci-doctor","events":["pull_request"],"ai_reaction":"eyes"}],"cloclo":[{"workflow":"cloclo","events":["discussion","issues","pull_request"],"ai_reaction":"eyes"}],"dev":[{"workflow":"dev","events":["discussion","issues","pull_request"],"ai_reaction":"eyes"}],"necromancer":[{"workflow":"necromancer","events":["pull_request"],"ai_reaction":"eyes"}],"needs-design":[{"workflow":"approach-validator","events":["issues","pull_request"],"ai_reaction":"eyes"}]}' with: script: | diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index 53bb61070b1..346734b5c41 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"f17bccc0ed91e64b7c3cff907b5a513092549fd7d00d1d990492e24515bdf6f1","strict":true,"agent_id":"copilot"} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"9545894780070d11ad24d202421b7fdb4a8ddddbd3ff48bc964aeebfc7e48932","strict":true,"agent_id":"copilot"} # gh-aw-manifest: {"version":1,"secrets":["COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN"],"actions":[{"repo":"actions/cache/restore","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/cache/save","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.46"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.46"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.46"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.9","digest":"sha256:64828b42a4482f58fab16509d7f8f495a6d97c972a98a68aff20543531ac0388","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.9@sha256:64828b42a4482f58fab16509d7f8f495a6d97c972a98a68aff20543531ac0388"},{"image":"ghcr.io/github/github-mcp-server:v1.0.4"},{"image":"mcp/markitdown","digest":"sha256:1cef3bf502503310ed0884441874ccf6cdaac20136dc1179797fa048269dc4cb","pinned_image":"mcp/markitdown@sha256:1cef3bf502503310ed0884441874ccf6cdaac20136dc1179797fa048269dc4cb"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) @@ -75,7 +75,7 @@ on: type: string url: description: URL(s) to resource(s) to analyze (comma-separated for multiple URLs) - required: true + required: false type: string permissions: {} @@ -263,21 +263,21 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_13803584a5c506a8_EOF' + cat << 'GH_AW_PROMPT_83a82e91f64ea609_EOF' - GH_AW_PROMPT_13803584a5c506a8_EOF + GH_AW_PROMPT_83a82e91f64ea609_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/cache_memory_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_13803584a5c506a8_EOF' + cat << 'GH_AW_PROMPT_83a82e91f64ea609_EOF' Tools: add_comment, create_discussion, missing_tool, missing_data, noop - GH_AW_PROMPT_13803584a5c506a8_EOF + GH_AW_PROMPT_83a82e91f64ea609_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_13803584a5c506a8_EOF' + cat << 'GH_AW_PROMPT_83a82e91f64ea609_EOF' The following GitHub context information is available for this workflow: {{#if github.actor}} @@ -306,19 +306,19 @@ jobs: {{/if}} - GH_AW_PROMPT_13803584a5c506a8_EOF + GH_AW_PROMPT_83a82e91f64ea609_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/github_mcp_tools_with_safeoutputs_prompt.md" if [ "$GITHUB_EVENT_NAME" = "issue_comment" ] && [ -n "$GH_AW_IS_PR_COMMENT" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review_comment" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review" ]; then cat "${RUNNER_TEMP}/gh-aw/prompts/pr_context_prompt.md" fi - cat << 'GH_AW_PROMPT_13803584a5c506a8_EOF' + cat << 'GH_AW_PROMPT_83a82e91f64ea609_EOF' {{#runtime-import .github/workflows/shared/mcp/markitdown.md}} {{#runtime-import .github/workflows/shared/reporting.md}} {{#runtime-import .github/workflows/shared/observability-otlp.md}} {{#runtime-import .github/workflows/shared/noop-reminder.md}} {{#runtime-import .github/workflows/pdf-summary.md}} - GH_AW_PROMPT_13803584a5c506a8_EOF + GH_AW_PROMPT_83a82e91f64ea609_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -570,9 +570,9 @@ jobs: mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_7ec836cbd3f34cbd_EOF' + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_515ba76f1bd04a4c_EOF' {"add_comment":{"max":1},"create_discussion":{"expires":24,"fallback_to_issue":true,"max":1},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} - GH_AW_SAFE_OUTPUTS_CONFIG_7ec836cbd3f34cbd_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_515ba76f1bd04a4c_EOF - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -795,7 +795,7 @@ jobs: mkdir -p /home/runner/.copilot GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_7b16283d2c428515_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_9ed7043b688a3489_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "github": { @@ -855,7 +855,7 @@ jobs: } } } - GH_AW_MCP_CONFIG_7b16283d2c428515_EOF + GH_AW_MCP_CONFIG_9ed7043b688a3489_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true diff --git a/.github/workflows/pdf-summary.md b/.github/workflows/pdf-summary.md index cf3697cce14..bfcc9e8d471 100644 --- a/.github/workflows/pdf-summary.md +++ b/.github/workflows/pdf-summary.md @@ -13,7 +13,7 @@ on: inputs: url: description: 'URL(s) to resource(s) to analyze (comma-separated for multiple URLs)' - required: true + required: false type: string query: description: 'Query or question to answer about the resource(s)' diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 8c984eb2964..6df3e0c645a 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -1,4 +1,4 @@ -# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"876ad3e3f5e72fe3ce92cf6800bad55f24d826e36fab9fa74b974d26ce2806b5","strict":true,"agent_id":"claude"} +# gh-aw-metadata: {"schema_version":"v3","frontmatter_hash":"d762596476e9ee11c5f0546bd2148f1b314544476475aa8103dfbd0cccc4a89b","strict":true,"agent_id":"claude"} # gh-aw-manifest: {"version":1,"secrets":["ANTHROPIC_API_KEY","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GH_AW_OTEL_GRAFANA_AUTHORIZATION","GH_AW_OTEL_GRAFANA_ENDPOINT","GH_AW_OTEL_SENTRY_AUTHORIZATION","GH_AW_OTEL_SENTRY_ENDPOINT","GITHUB_TOKEN","TAVILY_API_KEY"],"actions":[{"repo":"actions/cache/restore","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/cache/save","sha":"27d5ce7f107fe9357f9df03efb73ab90386fccae","version":"v5.0.5"},{"repo":"actions/checkout","sha":"de0fac2e4500dabe0009e67214ff5f5447ce83dd","version":"v6.0.2"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.25.46"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.25.46"},{"image":"ghcr.io/github/gh-aw-firewall/cli-proxy:0.25.46"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.25.46"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.9","digest":"sha256:64828b42a4482f58fab16509d7f8f495a6d97c972a98a68aff20543531ac0388","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.9@sha256:64828b42a4482f58fab16509d7f8f495a6d97c972a98a68aff20543531ac0388"},{"image":"ghcr.io/github/github-mcp-server:v1.0.4"},{"image":"mcp/arxiv-mcp-server","digest":"sha256:6dc6bba6dfed97f4ad6eb8d23a5c98ef5b7fa6184937d54b2d675801cd9dd29e","pinned_image":"mcp/arxiv-mcp-server@sha256:6dc6bba6dfed97f4ad6eb8d23a5c98ef5b7fa6184937d54b2d675801cd9dd29e"},{"image":"mcp/markitdown","digest":"sha256:1cef3bf502503310ed0884441874ccf6cdaac20136dc1179797fa048269dc4cb","pinned_image":"mcp/markitdown@sha256:1cef3bf502503310ed0884441874ccf6cdaac20136dc1179797fa048269dc4cb"},{"image":"node:lts-alpine","digest":"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f","pinned_image":"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"}]} # ___ _ _ # / _ \ | | (_) @@ -89,7 +89,7 @@ on: type: choice topic: description: Research topic or question - required: true + required: false permissions: {} @@ -277,21 +277,21 @@ jobs: run: | bash "${RUNNER_TEMP}/gh-aw/actions/create_prompt_first.sh" { - cat << 'GH_AW_PROMPT_3f97b0be61723276_EOF' + cat << 'GH_AW_PROMPT_10305b34369706b3_EOF' - GH_AW_PROMPT_3f97b0be61723276_EOF + GH_AW_PROMPT_10305b34369706b3_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/xpia.md" cat "${RUNNER_TEMP}/gh-aw/prompts/temp_folder_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/markdown.md" cat "${RUNNER_TEMP}/gh-aw/prompts/cache_memory_prompt.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" - cat << 'GH_AW_PROMPT_3f97b0be61723276_EOF' + cat << 'GH_AW_PROMPT_10305b34369706b3_EOF' Tools: add_comment, add_labels, missing_tool, missing_data, noop - GH_AW_PROMPT_3f97b0be61723276_EOF + GH_AW_PROMPT_10305b34369706b3_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/mcp_cli_tools_prompt.md" - cat << 'GH_AW_PROMPT_3f97b0be61723276_EOF' + cat << 'GH_AW_PROMPT_10305b34369706b3_EOF' The following GitHub context information is available for this workflow: {{#if github.actor}} @@ -320,12 +320,12 @@ jobs: {{/if}} - GH_AW_PROMPT_3f97b0be61723276_EOF + GH_AW_PROMPT_10305b34369706b3_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/cli_proxy_with_safeoutputs_prompt.md" if [ "$GITHUB_EVENT_NAME" = "issue_comment" ] && [ -n "$GH_AW_IS_PR_COMMENT" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review_comment" ] || [ "$GITHUB_EVENT_NAME" = "pull_request_review" ]; then cat "${RUNNER_TEMP}/gh-aw/prompts/pr_context_prompt.md" fi - cat << 'GH_AW_PROMPT_3f97b0be61723276_EOF' + cat << 'GH_AW_PROMPT_10305b34369706b3_EOF' {{#runtime-import .github/workflows/shared/reporting.md}} {{#runtime-import .github/workflows/shared/mcp/arxiv.md}} @@ -337,7 +337,7 @@ jobs: {{#runtime-import .github/workflows/shared/observability-otlp.md}} {{#runtime-import .github/workflows/shared/noop-reminder.md}} {{#runtime-import .github/workflows/scout.md}} - GH_AW_PROMPT_3f97b0be61723276_EOF + GH_AW_PROMPT_10305b34369706b3_EOF } > "$GH_AW_PROMPT" - name: Interpolate variables and render templates uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 @@ -590,9 +590,9 @@ jobs: mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs" mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs - cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_7f1bdfc34579045a_EOF' + cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_3a67a53bc13a95ff_EOF' {"add_comment":{"max":1},"add_labels":{"max":1},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} - GH_AW_SAFE_OUTPUTS_CONFIG_7f1bdfc34579045a_EOF + GH_AW_SAFE_OUTPUTS_CONFIG_3a67a53bc13a95ff_EOF - name: Generate Safe Outputs Tools env: GH_AW_TOOLS_META_JSON: | @@ -805,7 +805,7 @@ jobs: export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network host --add-host host.docker.internal:127.0.0.1 --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e GH_AW_SAFE_OUTPUTS_PORT -e GH_AW_SAFE_OUTPUTS_API_KEY -e GITHUB_AW_OTEL_TRACE_ID -e GITHUB_AW_OTEL_PARENT_SPAN_ID -e OTEL_EXPORTER_OTLP_HEADERS -e TAVILY_API_KEY -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw ghcr.io/github/gh-aw-mcpg:v0.3.9' GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) - cat << GH_AW_MCP_CONFIG_5ffea96d0f666af9_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + cat << GH_AW_MCP_CONFIG_ce395a5651924577_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" { "mcpServers": { "arxiv": { @@ -915,7 +915,7 @@ jobs: } } } - GH_AW_MCP_CONFIG_5ffea96d0f666af9_EOF + GH_AW_MCP_CONFIG_ce395a5651924577_EOF - name: Mount MCP servers as CLIs id: mount-mcp-clis continue-on-error: true diff --git a/.github/workflows/scout.md b/.github/workflows/scout.md index 32535679ea3..473060fc22f 100644 --- a/.github/workflows/scout.md +++ b/.github/workflows/scout.md @@ -12,7 +12,7 @@ on: inputs: topic: description: 'Research topic or question' - required: true + required: false history: description: "Git history to fetch: shallow (default) or full" required: false