diff --git a/internal/cli/cli_test.go b/internal/cli/cli_test.go index d21f56a..fb29e2a 100644 --- a/internal/cli/cli_test.go +++ b/internal/cli/cli_test.go @@ -865,6 +865,7 @@ func TestUsageErrors(t *testing.T) { {"mutually exclusive targets", []string{"send", "-a", "http://x", "-e", "http://y", "hi"}}, {"malformed agent-card url", []string{"card", "get", "-a", "http://exa mple.com"}}, {"missing agent-card file", []string{"card", "get", "-a", "/no/such/card.json"}}, + {"missing --file-part file", []string{"send", "-a", "http://x", "--file-part", "/no/such/file.txt"}}, } for _, tt := range tests { diff --git a/internal/clicfg/loader.go b/internal/clicfg/loader.go index 5d9756f..2e21492 100644 --- a/internal/clicfg/loader.go +++ b/internal/clicfg/loader.go @@ -22,6 +22,7 @@ import ( "path/filepath" "strings" + "github.com/a2aproject/a2a-cli/internal/clierr" "github.com/joho/godotenv" "gopkg.in/yaml.v3" ) @@ -83,7 +84,7 @@ func loadLocal(opts LoadOpts) (*loadedFile, error) { if opts.ConfigPath != "" { values, err := loadConfigFile(opts.ConfigPath) if err != nil { - return nil, fmt.Errorf("reading --config %q: %w", opts.ConfigPath, err) + return nil, clierr.Usage(fmt.Sprintf("reading --config %q: %v", opts.ConfigPath, err)) } return &loadedFile{path: opts.ConfigPath, values: values}, nil } diff --git a/internal/clicfg/store_test.go b/internal/clicfg/store_test.go index 322ffdc..acc6319 100644 --- a/internal/clicfg/store_test.go +++ b/internal/clicfg/store_test.go @@ -16,10 +16,13 @@ package clicfg import ( "bytes" + "errors" "os" "path/filepath" "strings" "testing" + + "github.com/a2aproject/a2a-cli/internal/clierr" ) func TestLoadStore(t *testing.T) { @@ -217,6 +220,16 @@ func TestLoadStoreErrors(t *testing.T) { } } +func TestLoadMissingConfigIsUsageError(t *testing.T) { + t.Parallel() + + _, err := Load(LoadOpts{ConfigPath: filepath.Join(t.TempDir(), "missing.yaml")}) + var ce *clierr.Error + if !errors.As(err, &ce) || ce.Code != clierr.CodeUsage { + t.Fatalf("Load() error = %v, want a usage error", err) + } +} + func TestLoadWalksUpForLocalEnv(t *testing.T) { t.Parallel() diff --git a/internal/flagparse/parts.go b/internal/flagparse/parts.go index 60e340c..229e109 100644 --- a/internal/flagparse/parts.go +++ b/internal/flagparse/parts.go @@ -23,6 +23,7 @@ import ( "path/filepath" "strings" + "github.com/a2aproject/a2a-cli/internal/clierr" "github.com/a2aproject/a2a-go/v2/a2a" "github.com/spf13/pflag" ) @@ -118,7 +119,7 @@ func buildFilePart(ref, mediaType string) (*a2a.Part, error) { path := strings.TrimPrefix(ref, "file://") data, err := os.ReadFile(path) if err != nil { - return nil, fmt.Errorf("reading --file-part %q: %w", ref, err) + return nil, clierr.Usage(fmt.Sprintf("reading --file-part %q: %v", ref, err)) } p := a2a.NewRawPart(data) p.Filename = filepath.Base(path)