From 66db91012d923044264f9a635013f4fc4edd133a Mon Sep 17 00:00:00 2001 From: wyxloading Date: Tue, 10 Mar 2026 16:40:18 +0800 Subject: [PATCH] fix: avoid printing banner in completion commands, add env PICOCLAW_NO_BANNER to control printing banner or not --- cmd/picoclaw/main.go | 26 ++++++++++- cmd/picoclaw/main_test.go | 91 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/cmd/picoclaw/main.go b/cmd/picoclaw/main.go index fe4de8ecc..41a041d0f 100644 --- a/cmd/picoclaw/main.go +++ b/cmd/picoclaw/main.go @@ -9,6 +9,7 @@ package main import ( "fmt" "os" + "strings" "github.com/spf13/cobra" @@ -61,8 +62,31 @@ const ( "\033[0m\r\n" ) +// shouldShowBanner returns true if the banner should be displayed. +// Banner is suppressed when: +// - PICOCLAW_NO_BANNER environment variable is set to "1" or "true" +// - Running shell completion commands (e.g., __complete, completion) +func shouldShowBanner() bool { + // Check environment variable + if noBanner := os.Getenv("PICOCLAW_NO_BANNER"); noBanner == "1" || strings.ToLower(noBanner) == "true" { + return false + } + + // Check for shell completion commands + // Cobra uses "__complete" and "__completeNoDesc" for completion + for _, arg := range os.Args[1:] { + if strings.HasPrefix(arg, "__complete") || arg == "completion" { + return false + } + } + + return true +} + func main() { - fmt.Printf("%s", banner) + if shouldShowBanner() { + fmt.Printf("%s", banner) + } cmd := NewPicoclawCommand() if err := cmd.Execute(); err != nil { os.Exit(1) diff --git a/cmd/picoclaw/main_test.go b/cmd/picoclaw/main_test.go index 3740ba358..7289ec7d8 100644 --- a/cmd/picoclaw/main_test.go +++ b/cmd/picoclaw/main_test.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "os" "slices" "testing" @@ -54,3 +55,93 @@ func TestNewPicoclawCommand(t *testing.T) { assert.False(t, subcmd.Hidden) } } + +func TestShouldShowBanner(t *testing.T) { + // Save original args to restore later + originalArgs := os.Args + defer func() { os.Args = originalArgs }() + + tests := []struct { + name string + args []string + envVar string + expected bool + }{ + { + name: "default shows banner", + args: []string{"picoclaw"}, + envVar: "", + expected: true, + }, + { + name: "normal command shows banner", + args: []string{"picoclaw", "version"}, + envVar: "", + expected: true, + }, + { + name: "__complete suppresses banner", + args: []string{"picoclaw", "__complete", "ver"}, + envVar: "", + expected: false, + }, + { + name: "__completeNoDesc suppresses banner", + args: []string{"picoclaw", "__completeNoDesc", "ver"}, + envVar: "", + expected: false, + }, + { + name: "completion command suppresses banner", + args: []string{"picoclaw", "completion", "bash"}, + envVar: "", + expected: false, + }, + { + name: "PICOCLAW_NO_BANNER=1 suppresses banner", + args: []string{"picoclaw", "version"}, + envVar: "1", + expected: false, + }, + { + name: "PICOCLAW_NO_BANNER=true suppresses banner", + args: []string{"picoclaw", "version"}, + envVar: "true", + expected: false, + }, + { + name: "PICOCLAW_NO_BANNER=TRUE suppresses banner", + args: []string{"picoclaw", "version"}, + envVar: "TRUE", + expected: false, + }, + { + name: "PICOCLAW_NO_BANNER=0 does not suppress banner", + args: []string{"picoclaw", "version"}, + envVar: "0", + expected: true, + }, + { + name: "PICOCLAW_NO_BANNER=false does not suppress banner", + args: []string{"picoclaw", "version"}, + envVar: "false", + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + os.Args = tt.args + + if tt.envVar != "" { + t.Setenv("PICOCLAW_NO_BANNER", tt.envVar) + } else { + // Clear env var if not set in test + os.Unsetenv("PICOCLAW_NO_BANNER") + } + + result := shouldShowBanner() + assert.Equal(t, tt.expected, result) + }) + } +}