From 9ab900f668d14ce59a5d81456a6b4a50ab7d48f6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Nov 2025 02:16:00 +0000 Subject: [PATCH 1/3] Initial plan From 97758b342d6fccf383f2ed2f04e12f1042b1d5b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Nov 2025 02:29:15 +0000 Subject: [PATCH 2/3] Refactor: Extract workflow metadata env vars to shared helper Extract duplicated workflow metadata environment variable setup logic from four safe-output job builders into a new shared helper function `buildWorkflowMetadataEnvVars`. This eliminates ~13 lines of duplicate code in each of: - pkg/workflow/add_comment.go - pkg/workflow/create_issue.go - pkg/workflow/create_pr_review_comment.go - pkg/workflow/create_discussion.go Benefits: - Single point of truth for workflow name/source env vars - Consistent behavior across all safe-output job builders - Fixed inconsistency: create_discussion.go now also includes source URL - Easier to maintain and modify in the future Added comprehensive tests for the new helper function covering: - Workflow name only - Workflow name and source with ref - Workflow name and source without ref - Empty workflow name - Invalid source format handling Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/add_comment.go | 13 ++-- pkg/workflow/create_discussion.go | 5 +- pkg/workflow/create_issue.go | 13 ++-- pkg/workflow/create_pr_review_comment.go | 13 ++-- pkg/workflow/safe_output_helpers_test.go | 80 ++++++++++++++++++++++++ pkg/workflow/safe_outputs.go | 20 ++++++ 6 files changed, 116 insertions(+), 28 deletions(-) diff --git a/pkg/workflow/add_comment.go b/pkg/workflow/add_comment.go index d934117dc52..ed4716e33f0 100644 --- a/pkg/workflow/add_comment.go +++ b/pkg/workflow/add_comment.go @@ -35,15 +35,10 @@ func (c *Compiler) buildCreateOutputAddCommentJob(data *WorkflowData, mainJobNam // Build custom environment variables specific to add-comment var customEnvVars []string - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_NAME: %q\n", data.Name)) - // Pass the workflow source URL for installation instructions - if data.Source != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE: %q\n", data.Source)) - sourceURL := buildSourceURL(data.Source) - if sourceURL != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE_URL: %q\n", sourceURL)) - } - } + + // Add workflow metadata (name and source) + customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) + // Pass the comment target configuration if data.SafeOutputs.AddComments.Target != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_COMMENT_TARGET: %q\n", data.SafeOutputs.AddComments.Target)) diff --git a/pkg/workflow/create_discussion.go b/pkg/workflow/create_discussion.go index 85397ec82a3..1371e7c530b 100644 --- a/pkg/workflow/create_discussion.go +++ b/pkg/workflow/create_discussion.go @@ -62,7 +62,10 @@ func (c *Compiler) buildCreateOutputDiscussionJob(data *WorkflowData, mainJobNam // Build custom environment variables specific to create-discussion var customEnvVars []string - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_NAME: %q\n", data.Name)) + + // Add workflow metadata (name and source) + customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) + if data.SafeOutputs.CreateDiscussions.TitlePrefix != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_DISCUSSION_TITLE_PREFIX: %q\n", data.SafeOutputs.CreateDiscussions.TitlePrefix)) } diff --git a/pkg/workflow/create_issue.go b/pkg/workflow/create_issue.go index 5e123dfc18c..d0372a2d430 100644 --- a/pkg/workflow/create_issue.go +++ b/pkg/workflow/create_issue.go @@ -70,15 +70,10 @@ func (c *Compiler) buildCreateOutputIssueJob(data *WorkflowData, mainJobName str // Build custom environment variables specific to create-issue var customEnvVars []string - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_NAME: %q\n", data.Name)) - // Pass the workflow source URL for installation instructions - if data.Source != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE: %q\n", data.Source)) - sourceURL := buildSourceURL(data.Source) - if sourceURL != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE_URL: %q\n", sourceURL)) - } - } + + // Add workflow metadata (name and source) + customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) + if data.SafeOutputs.CreateIssues.TitlePrefix != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_ISSUE_TITLE_PREFIX: %q\n", data.SafeOutputs.CreateIssues.TitlePrefix)) } diff --git a/pkg/workflow/create_pr_review_comment.go b/pkg/workflow/create_pr_review_comment.go index 39943900fac..5174bf0e304 100644 --- a/pkg/workflow/create_pr_review_comment.go +++ b/pkg/workflow/create_pr_review_comment.go @@ -20,15 +20,10 @@ func (c *Compiler) buildCreateOutputPullRequestReviewCommentJob(data *WorkflowDa // Build custom environment variables specific to create-pull-request-review-comment var customEnvVars []string - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_NAME: %q\n", data.Name)) - // Pass the workflow source URL for installation instructions - if data.Source != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE: %q\n", data.Source)) - sourceURL := buildSourceURL(data.Source) - if sourceURL != "" { - customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE_URL: %q\n", sourceURL)) - } - } + + // Add workflow metadata (name and source) + customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) + // Pass the side configuration if data.SafeOutputs.CreatePullRequestReviewComments.Side != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_PR_REVIEW_COMMENT_SIDE: %q\n", data.SafeOutputs.CreatePullRequestReviewComments.Side)) diff --git a/pkg/workflow/safe_output_helpers_test.go b/pkg/workflow/safe_output_helpers_test.go index f9bb79bf98c..c79decf6cf7 100644 --- a/pkg/workflow/safe_output_helpers_test.go +++ b/pkg/workflow/safe_output_helpers_test.go @@ -382,6 +382,86 @@ func TestApplySafeOutputEnvToSlice(t *testing.T) { } } +// TestBuildWorkflowMetadataEnvVars verifies the helper function for workflow metadata env vars +func TestBuildWorkflowMetadataEnvVars(t *testing.T) { + tests := []struct { + name string + workflowName string + workflowSource string + expected []string + }{ + { + name: "workflow name only", + workflowName: "Test Workflow", + expected: []string{ + " GH_AW_WORKFLOW_NAME: \"Test Workflow\"\n", + }, + }, + { + name: "workflow name and source", + workflowName: "Issue Triage", + workflowSource: "owner/repo/workflows/triage.md@main", + expected: []string{ + " GH_AW_WORKFLOW_NAME: \"Issue Triage\"\n", + " GH_AW_WORKFLOW_SOURCE: \"owner/repo/workflows/triage.md@main\"\n", + " GH_AW_WORKFLOW_SOURCE_URL: \"${{ github.server_url }}/owner/repo/tree/main/workflows/triage.md\"\n", + }, + }, + { + name: "workflow name and source without ref", + workflowName: "CI Helper", + workflowSource: "org/project/ci/helper.md", + expected: []string{ + " GH_AW_WORKFLOW_NAME: \"CI Helper\"\n", + " GH_AW_WORKFLOW_SOURCE: \"org/project/ci/helper.md\"\n", + " GH_AW_WORKFLOW_SOURCE_URL: \"${{ github.server_url }}/org/project/tree/main/ci/helper.md\"\n", + }, + }, + { + name: "empty workflow name", + workflowName: "", + workflowSource: "owner/repo/workflow.md", + expected: []string{ + " GH_AW_WORKFLOW_NAME: \"\"\n", + " GH_AW_WORKFLOW_SOURCE: \"owner/repo/workflow.md\"\n", + " GH_AW_WORKFLOW_SOURCE_URL: \"${{ github.server_url }}/owner/repo/tree/main/workflow.md\"\n", + }, + }, + { + name: "source with invalid format does not produce URL", + workflowName: "Test", + workflowSource: "invalid-source", + expected: []string{ + " GH_AW_WORKFLOW_NAME: \"Test\"\n", + " GH_AW_WORKFLOW_SOURCE: \"invalid-source\"\n", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := buildWorkflowMetadataEnvVars(tt.workflowName, tt.workflowSource) + + if len(result) != len(tt.expected) { + t.Errorf("Expected %d env vars, got %d", len(tt.expected), len(result)) + t.Logf("Expected: %v", tt.expected) + t.Logf("Got: %v", result) + return + } + + for i, expectedVar := range tt.expected { + if i >= len(result) { + t.Errorf("Missing expected env var %d: %q", i, expectedVar) + continue + } + if result[i] != expectedVar { + t.Errorf("Env var %d: expected %q, got %q", i, expectedVar, result[i]) + } + } + }) + } +} + // TestBuildSafeOutputJobEnvVars verifies the helper function for safe-output job env vars func TestBuildSafeOutputJobEnvVars(t *testing.T) { tests := []struct { diff --git a/pkg/workflow/safe_outputs.go b/pkg/workflow/safe_outputs.go index 00d2f089544..757f3d919f0 100644 --- a/pkg/workflow/safe_outputs.go +++ b/pkg/workflow/safe_outputs.go @@ -872,6 +872,26 @@ func applySafeOutputEnvToSlice(stepLines *[]string, workflowData *WorkflowData) } } +// buildWorkflowMetadataEnvVars builds workflow name and source environment variables +// This extracts the duplicated workflow metadata setup logic from safe-output job builders +func buildWorkflowMetadataEnvVars(workflowName string, workflowSource string) []string { + var customEnvVars []string + + // Add workflow name + customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_NAME: %q\n", workflowName)) + + // Add workflow source and source URL if present + if workflowSource != "" { + customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE: %q\n", workflowSource)) + sourceURL := buildSourceURL(workflowSource) + if sourceURL != "" { + customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_WORKFLOW_SOURCE_URL: %q\n", sourceURL)) + } + } + + return customEnvVars +} + // buildSafeOutputJobEnvVars builds environment variables for safe-output jobs with staged/target repo handling // This extracts the duplicated env setup logic in safe-output job builders (create_issue, add_comment, etc.) func buildSafeOutputJobEnvVars(trialMode bool, trialLogicalRepoSlug string, staged bool, targetRepoSlug string) []string { From 3abf3c3d43a6a9065b9230e534a01ec4f71bee22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 11 Nov 2025 03:00:46 +0000 Subject: [PATCH 3/3] Fix: Apply gofmt formatting to remove trailing whitespace Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/workflows/daily-perf-improver.lock.yml | 2 ++ .github/workflows/daily-test-improver.lock.yml | 2 ++ pkg/workflow/add_comment.go | 4 ++-- pkg/workflow/create_discussion.go | 4 ++-- pkg/workflow/create_issue.go | 4 ++-- pkg/workflow/create_pr_review_comment.go | 4 ++-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/daily-perf-improver.lock.yml b/.github/workflows/daily-perf-improver.lock.yml index 664c2894285..99ada46cb95 100644 --- a/.github/workflows/daily-perf-improver.lock.yml +++ b/.github/workflows/daily-perf-improver.lock.yml @@ -4374,6 +4374,8 @@ jobs: env: GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: "Daily Perf Improver" + GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/daily-perf-improver.md@1f181b37d3fe5862ab590648f25a292e345b5de6" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/1f181b37d3fe5862ab590648f25a292e345b5de6/workflows/daily-perf-improver.md" GH_AW_DISCUSSION_TITLE_PREFIX: "${{ github.workflow }}" GH_AW_DISCUSSION_CATEGORY: "ideas" with: diff --git a/.github/workflows/daily-test-improver.lock.yml b/.github/workflows/daily-test-improver.lock.yml index adba269c3fc..ee5cf2c5e98 100644 --- a/.github/workflows/daily-test-improver.lock.yml +++ b/.github/workflows/daily-test-improver.lock.yml @@ -4348,6 +4348,8 @@ jobs: env: GH_AW_AGENT_OUTPUT: ${{ env.GH_AW_AGENT_OUTPUT }} GH_AW_WORKFLOW_NAME: "Daily Test Coverage Improver" + GH_AW_WORKFLOW_SOURCE: "githubnext/agentics/workflows/daily-test-improver.md@1f181b37d3fe5862ab590648f25a292e345b5de6" + GH_AW_WORKFLOW_SOURCE_URL: "${{ github.server_url }}/githubnext/agentics/tree/1f181b37d3fe5862ab590648f25a292e345b5de6/workflows/daily-test-improver.md" GH_AW_DISCUSSION_TITLE_PREFIX: "${{ github.workflow }}" GH_AW_DISCUSSION_CATEGORY: "ideas" with: diff --git a/pkg/workflow/add_comment.go b/pkg/workflow/add_comment.go index ed4716e33f0..2b9d7432a02 100644 --- a/pkg/workflow/add_comment.go +++ b/pkg/workflow/add_comment.go @@ -35,10 +35,10 @@ func (c *Compiler) buildCreateOutputAddCommentJob(data *WorkflowData, mainJobNam // Build custom environment variables specific to add-comment var customEnvVars []string - + // Add workflow metadata (name and source) customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) - + // Pass the comment target configuration if data.SafeOutputs.AddComments.Target != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_COMMENT_TARGET: %q\n", data.SafeOutputs.AddComments.Target)) diff --git a/pkg/workflow/create_discussion.go b/pkg/workflow/create_discussion.go index 1371e7c530b..b90f1bd12ff 100644 --- a/pkg/workflow/create_discussion.go +++ b/pkg/workflow/create_discussion.go @@ -62,10 +62,10 @@ func (c *Compiler) buildCreateOutputDiscussionJob(data *WorkflowData, mainJobNam // Build custom environment variables specific to create-discussion var customEnvVars []string - + // Add workflow metadata (name and source) customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) - + if data.SafeOutputs.CreateDiscussions.TitlePrefix != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_DISCUSSION_TITLE_PREFIX: %q\n", data.SafeOutputs.CreateDiscussions.TitlePrefix)) } diff --git a/pkg/workflow/create_issue.go b/pkg/workflow/create_issue.go index d0372a2d430..d25baaa4077 100644 --- a/pkg/workflow/create_issue.go +++ b/pkg/workflow/create_issue.go @@ -70,10 +70,10 @@ func (c *Compiler) buildCreateOutputIssueJob(data *WorkflowData, mainJobName str // Build custom environment variables specific to create-issue var customEnvVars []string - + // Add workflow metadata (name and source) customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) - + if data.SafeOutputs.CreateIssues.TitlePrefix != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_ISSUE_TITLE_PREFIX: %q\n", data.SafeOutputs.CreateIssues.TitlePrefix)) } diff --git a/pkg/workflow/create_pr_review_comment.go b/pkg/workflow/create_pr_review_comment.go index 5174bf0e304..89e385070c5 100644 --- a/pkg/workflow/create_pr_review_comment.go +++ b/pkg/workflow/create_pr_review_comment.go @@ -20,10 +20,10 @@ func (c *Compiler) buildCreateOutputPullRequestReviewCommentJob(data *WorkflowDa // Build custom environment variables specific to create-pull-request-review-comment var customEnvVars []string - + // Add workflow metadata (name and source) customEnvVars = append(customEnvVars, buildWorkflowMetadataEnvVars(data.Name, data.Source)...) - + // Pass the side configuration if data.SafeOutputs.CreatePullRequestReviewComments.Side != "" { customEnvVars = append(customEnvVars, fmt.Sprintf(" GH_AW_PR_REVIEW_COMMENT_SIDE: %q\n", data.SafeOutputs.CreatePullRequestReviewComments.Side))