From 546a5961c70f11c68faed4edd37eb9da572c91b1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Jun 2026 06:00:37 +0000 Subject: [PATCH 1/4] Initial plan From b6d2a508cea93711d3891c2cfea91b783f6e895e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Jun 2026 06:09:39 +0000 Subject: [PATCH 2/4] Plan linter precision fix Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/skills/agentic-workflows/SKILL.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/skills/agentic-workflows/SKILL.md b/.github/skills/agentic-workflows/SKILL.md index b4505045ca5..6bba5fae3d6 100644 --- a/.github/skills/agentic-workflows/SKILL.md +++ b/.github/skills/agentic-workflows/SKILL.md @@ -12,7 +12,6 @@ This skill is a dispatcher: identify the task type, load the matching workflow p Read only the files you need: Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/agentic-chat.md` -- `.github/aw/agentic-workflows-mcp.md` - `.github/aw/asciicharts.md` - `.github/aw/campaign.md` - `.github/aw/charts-trending.md` @@ -28,7 +27,6 @@ Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/github-agentic-workflows.md` - `.github/aw/github-mcp-server.md` - `.github/aw/llms.md` -- `.github/aw/mcp-clis.md` - `.github/aw/memory.md` - `.github/aw/messages.md` - `.github/aw/network.md` From 93b15353d3f1c4ff23579c19840810f285e16369 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Jun 2026 06:11:29 +0000 Subject: [PATCH 3/4] Fix tolowerequalfold self-comparison false positives Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../src/tolowerequalfold/tolowerequalfold.go | 10 +++-- .../tolowerequalfold/tolowerequalfold.go | 44 ++++++++++++++++--- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/pkg/linters/tolowerequalfold/testdata/src/tolowerequalfold/tolowerequalfold.go b/pkg/linters/tolowerequalfold/testdata/src/tolowerequalfold/tolowerequalfold.go index c17e4c69d95..72e12101edc 100644 --- a/pkg/linters/tolowerequalfold/testdata/src/tolowerequalfold/tolowerequalfold.go +++ b/pkg/linters/tolowerequalfold/testdata/src/tolowerequalfold/tolowerequalfold.go @@ -7,10 +7,10 @@ func flaggedExamples() { name := "Alice" // should use strings.EqualFold(name, "alice") - _ = strings.ToLower(name) == "alice" // want `use strings\.EqualFold` - _ = strings.ToUpper(name) == "ALICE" // want `use strings\.EqualFold` - _ = "alice" == strings.ToLower(name) // want `use strings\.EqualFold` - _ = strings.ToLower(name) != "alice" // want `use strings\.EqualFold` + _ = strings.ToLower(name) == "alice" // want `use strings\.EqualFold` + _ = strings.ToUpper(name) == "ALICE" // want `use strings\.EqualFold` + _ = "alice" == strings.ToLower(name) // want `use strings\.EqualFold` + _ = strings.ToLower(name) != "alice" // want `use strings\.EqualFold` _ = strings.ToLower(name) == strings.ToLower("alice") // want `use strings\.EqualFold` } @@ -23,4 +23,6 @@ func okExamples() { // Regular case-sensitive comparison — no diagnostic _ = name == "Alice" _ = strings.ToLower(name) // used standalone, not in a comparison + _ = strings.ToLower(name) == name + _ = strings.ToLower(name) != name } diff --git a/pkg/linters/tolowerequalfold/tolowerequalfold.go b/pkg/linters/tolowerequalfold/tolowerequalfold.go index 9c98971abcb..92a14cc753c 100644 --- a/pkg/linters/tolowerequalfold/tolowerequalfold.go +++ b/pkg/linters/tolowerequalfold/tolowerequalfold.go @@ -47,10 +47,14 @@ func run(pass *analysis.Pass) (any, error) { return } - lowerLeft := isCaseConvCall(expr.X) - lowerRight := isCaseConvCall(expr.Y) + if arg, ok := caseConvArg(expr.X); ok && sameOperand(pass, arg, expr.Y) { + return + } + if arg, ok := caseConvArg(expr.Y); ok && sameOperand(pass, expr.X, arg) { + return + } - if lowerLeft || lowerRight { + if isCaseConvCall(expr.X) || isCaseConvCall(expr.Y) { pass.ReportRangef(expr, "use strings.EqualFold for case-insensitive comparison instead of strings.ToLower/ToUpper with ==") } @@ -61,18 +65,44 @@ func run(pass *analysis.Pass) (any, error) { // isCaseConvCall reports whether node is a call to strings.ToLower or strings.ToUpper. func isCaseConvCall(n ast.Node) bool { + _, ok := caseConvArg(n) + return ok +} + +// caseConvArg returns the argument when n is strings.ToLower/ToUpper(). +func caseConvArg(n ast.Node) (ast.Expr, bool) { call, ok := n.(*ast.CallExpr) if !ok { - return false + return nil, false + } + if len(call.Args) != 1 { + return nil, false } sel, ok := call.Fun.(*ast.SelectorExpr) if !ok { - return false + return nil, false } ident, ok := sel.X.(*ast.Ident) if !ok { + return nil, false + } + if ident.Name != "strings" { + return nil, false + } + if sel.Sel.Name != "ToLower" && sel.Sel.Name != "ToUpper" { + return nil, false + } + return call.Args[0], true +} + +func sameOperand(pass *analysis.Pass, left ast.Expr, right ast.Expr) bool { + leftIdent, leftOK := left.(*ast.Ident) + rightIdent, rightOK := right.(*ast.Ident) + if !leftOK || !rightOK { return false } - return ident.Name == "strings" && - (sel.Sel.Name == "ToLower" || sel.Sel.Name == "ToUpper") + + leftObj := pass.TypesInfo.ObjectOf(leftIdent) + rightObj := pass.TypesInfo.ObjectOf(rightIdent) + return leftObj != nil && rightObj != nil && leftObj == rightObj } From fa9c4a8fd6c0426145a4f08c13aa589407f76c1c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Jun 2026 12:37:26 +0000 Subject: [PATCH 4/4] Restore missing files in agentic-workflows SKILL list Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/skills/agentic-workflows/SKILL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/skills/agentic-workflows/SKILL.md b/.github/skills/agentic-workflows/SKILL.md index 6bba5fae3d6..b4505045ca5 100644 --- a/.github/skills/agentic-workflows/SKILL.md +++ b/.github/skills/agentic-workflows/SKILL.md @@ -12,6 +12,7 @@ This skill is a dispatcher: identify the task type, load the matching workflow p Read only the files you need: Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/agentic-chat.md` +- `.github/aw/agentic-workflows-mcp.md` - `.github/aw/asciicharts.md` - `.github/aw/campaign.md` - `.github/aw/charts-trending.md` @@ -27,6 +28,7 @@ Load these files from `github/gh-aw` (they are not available locally). - `.github/aw/github-agentic-workflows.md` - `.github/aw/github-mcp-server.md` - `.github/aw/llms.md` +- `.github/aw/mcp-clis.md` - `.github/aw/memory.md` - `.github/aw/messages.md` - `.github/aw/network.md`