From d7b840314ceb0786a9f0e4d27e2ace8925100585 Mon Sep 17 00:00:00 2001 From: Edward McFarlane Date: Wed, 29 Jul 2026 14:37:36 +0100 Subject: [PATCH 1/3] Support protoopaque builds --- Makefile | 5 +++ check/annotation.go | 4 +- check/category.go | 4 +- check/check_service_handler.go | 8 ++-- check/check_service_handler_test.go | 52 +++++++++++++------------- check/checktest/checktest.go | 4 +- check/client.go | 8 ++-- check/request.go | 8 ++-- check/response.go | 4 +- check/rule.go | 4 +- descriptor/file_descriptor.go | 4 +- descriptor/file_location.go | 4 +- info/license.go | 12 ++---- info/plugin_info.go | 4 +- info/plugin_info_service_handler.go | 4 +- option/options.go | 57 ++++++++++++----------------- 16 files changed, 88 insertions(+), 98 deletions(-) diff --git a/Makefile b/Makefile index 9e07e48..44f46fa 100644 --- a/Makefile +++ b/Makefile @@ -33,10 +33,14 @@ clean: ## Delete intermediate build artifacts .PHONY: test test: build ## Run unit tests go test -vet=off -race -cover ./... + @# Also run against the Go Opaque API, which the protoopaque build tag selects + @# for the hybrid-generated Protobuf packages we depend on. + go test -vet=off -race -cover -tags protoopaque ./... .PHONY: build build: generate ## Build all packages go build ./... + go build -tags protoopaque ./... .PHONY: install install: ## Install all binaries @@ -45,6 +49,7 @@ install: ## Install all binaries .PHONY: lint lint: $(BIN)/golangci-lint ## Lint go vet ./... + go vet -tags protoopaque ./... golangci-lint run --modules-download-mode=readonly --timeout=3m0s .PHONY: lintfix diff --git a/check/annotation.go b/check/annotation.go index 26104b0..1a6ac7a 100644 --- a/check/annotation.go +++ b/check/annotation.go @@ -104,12 +104,12 @@ func (a *annotation) toProto() *checkv1.Annotation { if a.againstFileLocation != nil { protoAgainstFileLocation = a.againstFileLocation.ToProto() } - return &checkv1.Annotation{ + return checkv1.Annotation_builder{ RuleId: a.RuleID(), Message: a.Message(), FileLocation: protoFileLocation, AgainstFileLocation: protoAgainstFileLocation, - } + }.Build() } func (*annotation) isAnnotation() {} diff --git a/check/category.go b/check/category.go index 63bc11d..89b1c95 100644 --- a/check/category.go +++ b/check/category.go @@ -111,12 +111,12 @@ func (r *category) toProto() *checkv1.Category { if r == nil { return nil } - return &checkv1.Category{ + return checkv1.Category_builder{ Id: r.id, Purpose: r.purpose, Deprecated: r.deprecated, ReplacementIds: r.replacementIDs, - } + }.Build() } func (*category) isCategory() {} diff --git a/check/check_service_handler.go b/check/check_service_handler.go index ad78e43..e8ccef2 100644 --- a/check/check_service_handler.go +++ b/check/check_service_handler.go @@ -221,10 +221,10 @@ func (c *checkServiceHandler) ListRules(_ context.Context, listRulesRequest *che if err != nil { return nil, err } - listRulesResponse := &checkv1.ListRulesResponse{ + listRulesResponse := checkv1.ListRulesResponse_builder{ NextPageToken: nextPageToken, Rules: xslices.Map(rules, Rule.toProto), - } + }.Build() if err := c.validator.Validate(listRulesResponse); err != nil { return nil, err } @@ -242,10 +242,10 @@ func (c *checkServiceHandler) ListCategories(_ context.Context, listCategoriesRe if err != nil { return nil, err } - listCategoriesResponse := &checkv1.ListCategoriesResponse{ + listCategoriesResponse := checkv1.ListCategoriesResponse_builder{ NextPageToken: nextPageToken, Categories: xslices.Map(categories, Category.toProto), - } + }.Build() if err := c.validator.Validate(listCategoriesResponse); err != nil { return nil, err } diff --git a/check/check_service_handler_test.go b/check/check_service_handler_test.go index 67fc7b4..fa68c10 100644 --- a/check/check_service_handler_test.go +++ b/check/check_service_handler_test.go @@ -39,45 +39,45 @@ func TestCheckServiceHandlerUniqueFiles(t *testing.T) { _, err = checkServiceHandler.Check( t.Context(), - &checkv1.CheckRequest{ + checkv1.CheckRequest_builder{ FileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, + }.Build(), }, AgainstFileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, + }.Build(), }, - }, + }.Build(), ) require.NoError(t, err) _, err = checkServiceHandler.Check( t.Context(), - &checkv1.CheckRequest{ + checkv1.CheckRequest_builder{ FileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, - { + }.Build(), + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, + }.Build(), }, - }, + }.Build(), ) pluginrpcError := &pluginrpc.Error{} require.ErrorAs(t, err, &pluginrpcError) @@ -85,30 +85,30 @@ func TestCheckServiceHandlerUniqueFiles(t *testing.T) { _, err = checkServiceHandler.Check( t.Context(), - &checkv1.CheckRequest{ + checkv1.CheckRequest_builder{ FileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, + }.Build(), }, AgainstFileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("bar.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, - { + }.Build(), + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("bar.proto"), SourceCodeInfo: &descriptorpb.SourceCodeInfo{}, }, - }, + }.Build(), }, - }, + }.Build(), ) pluginrpcError = &pluginrpc.Error{} require.ErrorAs(t, err, &pluginrpcError) @@ -129,22 +129,22 @@ func TestCheckServiceHandlerNoSourceCodeInfo(t *testing.T) { _, err = checkServiceHandler.Check( t.Context(), - &checkv1.CheckRequest{ + checkv1.CheckRequest_builder{ FileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), }, - }, + }.Build(), }, AgainstFileDescriptors: []*descriptorv1.FileDescriptor{ - { + descriptorv1.FileDescriptor_builder{ FileDescriptorProto: &descriptorpb.FileDescriptorProto{ Name: proto.String("foo.proto"), }, - }, + }.Build(), }, - }, + }.Build(), ) require.NoError(t, err) } diff --git a/check/checktest/checktest.go b/check/checktest/checktest.go index 6bc1b48..82e0038 100644 --- a/check/checktest/checktest.go +++ b/check/checktest/checktest.go @@ -361,12 +361,12 @@ func compile(ctx context.Context, dirPaths []string, filePaths []string) ([]desc fileDescriptorProto, filePathToUnusedDependencyFilePaths[fileDescriptorProto.GetName()], ) - protoFileDescriptors[i] = &descriptorv1.FileDescriptor{ + protoFileDescriptors[i] = descriptorv1.FileDescriptor_builder{ FileDescriptorProto: fileDescriptorProto, IsImport: !isNotImport, IsSyntaxUnspecified: isSyntaxUnspecified, UnusedDependency: unusedDependencyIndexes, - } + }.Build() } return descriptor.FileDescriptorsForProtoFileDescriptors(protoFileDescriptors) } diff --git a/check/client.go b/check/client.go index 9a83874..704dacc 100644 --- a/check/client.go +++ b/check/client.go @@ -208,10 +208,10 @@ func (c *client) listRulesUncached(ctx context.Context) ([]Rule, error) { for { response, err := checkServiceClient.ListRules( ctx, - &checkv1.ListRulesRequest{ + checkv1.ListRulesRequest_builder{ PageSize: listRulesPageSize, PageToken: pageToken, - }, + }.Build(), ) if err != nil { return nil, err @@ -259,10 +259,10 @@ func (c *client) listCategoriesUncached(ctx context.Context) ([]Category, error) for { response, err := checkServiceClient.ListCategories( ctx, - &checkv1.ListCategoriesRequest{ + checkv1.ListCategoriesRequest_builder{ PageSize: listCategoriesPageSize, PageToken: pageToken, - }, + }.Build(), ) if err != nil { return nil, err diff --git a/check/request.go b/check/request.go index 92ee1f0..afb4727 100644 --- a/check/request.go +++ b/check/request.go @@ -194,11 +194,11 @@ func (r *request) toProtos() ([]*checkv1.CheckRequest, error) { } if len(r.ruleIDs) == 0 { return []*checkv1.CheckRequest{ - { + checkv1.CheckRequest_builder{ FileDescriptors: protoFileDescriptors, AgainstFileDescriptors: protoAgainstFileDescriptors, Options: protoOptions, - }, + }.Build(), }, nil } var checkRequests []*checkv1.CheckRequest @@ -207,12 +207,12 @@ func (r *request) toProtos() ([]*checkv1.CheckRequest, error) { end := min(start+checkRuleIDPageSize, len(r.ruleIDs)) checkRequests = append( checkRequests, - &checkv1.CheckRequest{ + checkv1.CheckRequest_builder{ FileDescriptors: protoFileDescriptors, AgainstFileDescriptors: protoAgainstFileDescriptors, Options: protoOptions, RuleIds: r.ruleIDs[start:end], - }, + }.Build(), ) } return checkRequests, nil diff --git a/check/response.go b/check/response.go index 51b4910..6bbc084 100644 --- a/check/response.go +++ b/check/response.go @@ -51,9 +51,9 @@ func (r *response) Annotations() []Annotation { } func (r *response) toProto() *checkv1.CheckResponse { - return &checkv1.CheckResponse{ + return checkv1.CheckResponse_builder{ Annotations: xslices.Map(r.annotations, Annotation.toProto), - } + }.Build() } func (*response) isResponse() {} diff --git a/check/rule.go b/check/rule.go index 71097f5..8cec3a9 100644 --- a/check/rule.go +++ b/check/rule.go @@ -152,7 +152,7 @@ func (r *rule) toProto() *checkv1.Rule { return nil } protoRuleType := ruleTypeToProtoRuleType[r.ruleType] - return &checkv1.Rule{ + return checkv1.Rule_builder{ Id: r.id, CategoryIds: xslices.Map(r.categories, Category.ID), Default: r.isDefault, @@ -160,7 +160,7 @@ func (r *rule) toProto() *checkv1.Rule { Type: protoRuleType, Deprecated: r.deprecated, ReplacementIds: r.replacementIDs, - } + }.Build() } func (*rule) isRule() {} diff --git a/descriptor/file_descriptor.go b/descriptor/file_descriptor.go index c8e8274..78a3986 100644 --- a/descriptor/file_descriptor.go +++ b/descriptor/file_descriptor.go @@ -179,12 +179,12 @@ func (f *fileDescriptor) ToProto() *descriptorv1.FileDescriptor { if f == nil { return nil } - return &descriptorv1.FileDescriptor{ + return descriptorv1.FileDescriptor_builder{ FileDescriptorProto: f.fileDescriptorProto, IsImport: f.isImport, IsSyntaxUnspecified: f.isSyntaxUnspecified, UnusedDependency: f.unusedDependencyIndexes, - } + }.Build() } func (*fileDescriptor) isFileDescriptor() {} diff --git a/descriptor/file_location.go b/descriptor/file_location.go index 84189eb..39aa1d3 100644 --- a/descriptor/file_location.go +++ b/descriptor/file_location.go @@ -113,10 +113,10 @@ func (l *fileLocation) ToProto() *descriptorv1.FileLocation { if l == nil { return nil } - return &descriptorv1.FileLocation{ + return descriptorv1.FileLocation_builder{ FileName: l.fileDescriptor.ProtoreflectFileDescriptor().Path(), SourcePath: l.sourceLocation.Path, - } + }.Build() } func (l *fileLocation) unclonedSourcePath() protoreflect.SourcePath { diff --git a/info/license.go b/info/license.go index 7c96fb6..f427583 100644 --- a/info/license.go +++ b/info/license.go @@ -101,17 +101,13 @@ func (l *license) toProto() *infov1.License { if l == nil { return nil } - protoLicense := &infov1.License{ + protoLicense := infov1.License_builder{ SpdxLicenseId: l.SPDXLicenseID(), - } + }.Build() if l.text != "" { - protoLicense.Source = &infov1.License_Text{ - Text: l.text, - } + protoLicense.SetText(l.text) } else if l.url != nil { - protoLicense.Source = &infov1.License_Url{ - Url: l.url.String(), - } + protoLicense.SetUrl(l.url.String()) } return protoLicense } diff --git a/info/plugin_info.go b/info/plugin_info.go index bbf8319..840cb20 100644 --- a/info/plugin_info.go +++ b/info/plugin_info.go @@ -95,10 +95,10 @@ func (p *pluginInfo) License() License { } func (p *pluginInfo) toProto() *infov1.PluginInfo { - return &infov1.PluginInfo{ + return infov1.PluginInfo_builder{ Documentation: p.documentation, License: p.license.toProto(), - } + }.Build() } func (*pluginInfo) isPluginInfo() {} diff --git a/info/plugin_info_service_handler.go b/info/plugin_info_service_handler.go index 8e4d53d..ccd0d6f 100644 --- a/info/plugin_info_service_handler.go +++ b/info/plugin_info_service_handler.go @@ -57,9 +57,9 @@ func newPluginInfoServiceHandler(spec *Spec, options ...PluginInfoServiceHandler return nil, err } protoPluginInfo := pluginInfo.toProto() - getPluginInfoResponse := &infov1.GetPluginInfoResponse{ + getPluginInfoResponse := infov1.GetPluginInfoResponse_builder{ PluginInfo: protoPluginInfo, - } + }.Build() validator := opts.validator if validator == nil { validator = protovalidate.GlobalValidator diff --git a/option/options.go b/option/options.go index e1595e9..7e89f2a 100644 --- a/option/options.go +++ b/option/options.go @@ -29,6 +29,7 @@ import ( "reflect" optionv1 "buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go/buf/plugin/option/v1" + "google.golang.org/protobuf/proto" ) // EmptyOptions is an instance of Options with no keys. @@ -254,10 +255,10 @@ func (o *options) ToProto() ([]*optionv1.Option, error) { // Assuming that we've validated that no values are empty. protoOptions = append( protoOptions, - &optionv1.Option{ + optionv1.Option_builder{ Key: key, Value: protoValue, - }, + }.Build(), ) } return protoOptions, nil @@ -269,36 +270,26 @@ func (*options) isOption() {} func valueToProtoValue(value any) (*optionv1.Value, error) { switch reflectValue := reflect.ValueOf(value); reflectValue.Kind() { case reflect.Bool: - return &optionv1.Value{ - Type: &optionv1.Value_BoolValue{ - BoolValue: reflectValue.Bool(), - }, - }, nil + return optionv1.Value_builder{ + BoolValue: proto.Bool(reflectValue.Bool()), + }.Build(), nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return &optionv1.Value{ - Type: &optionv1.Value_Int64Value{ - Int64Value: reflectValue.Int(), - }, - }, nil + return optionv1.Value_builder{ + Int64Value: proto.Int64(reflectValue.Int()), + }.Build(), nil case reflect.Float32, reflect.Float64: - return &optionv1.Value{ - Type: &optionv1.Value_DoubleValue{ - DoubleValue: reflectValue.Float(), - }, - }, nil + return optionv1.Value_builder{ + DoubleValue: proto.Float64(reflectValue.Float()), + }.Build(), nil case reflect.String: - return &optionv1.Value{ - Type: &optionv1.Value_StringValue{ - StringValue: reflectValue.String(), - }, - }, nil + return optionv1.Value_builder{ + StringValue: proto.String(reflectValue.String()), + }.Build(), nil case reflect.Slice: if t, ok := value.([]byte); ok { - return &optionv1.Value{ - Type: &optionv1.Value_BytesValue{ - BytesValue: t, - }, - }, nil + return optionv1.Value_builder{ + BytesValue: t, + }.Build(), nil } values := make([]*optionv1.Value, reflectValue.Len()) for i := range reflectValue.Len() { @@ -308,13 +299,11 @@ func valueToProtoValue(value any) (*optionv1.Value, error) { } values[i] = subValue } - return &optionv1.Value{ - Type: &optionv1.Value_ListValue{ - ListValue: &optionv1.ListValue{ - Values: values, - }, - }, - }, nil + return optionv1.Value_builder{ + ListValue: optionv1.ListValue_builder{ + Values: values, + }.Build(), + }.Build(), nil case reflect.Invalid, reflect.Uintptr, reflect.Complex64, reflect.Complex128, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer | reflect.Ptr, reflect.Struct, reflect.UnsafePointer: return nil, fmt.Errorf("invalid type for Options value %T", value) default: From 4f5944eaa0547a5425acc8b88b48d95e07f1e05a Mon Sep 17 00:00:00 2001 From: Edward McFarlane Date: Wed, 29 Jul 2026 15:52:59 +0100 Subject: [PATCH 2/3] Simplify --- Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Makefile b/Makefile index 44f46fa..d05ba97 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,6 @@ test: build ## Run unit tests .PHONY: build build: generate ## Build all packages go build ./... - go build -tags protoopaque ./... .PHONY: install install: ## Install all binaries @@ -49,7 +48,6 @@ install: ## Install all binaries .PHONY: lint lint: $(BIN)/golangci-lint ## Lint go vet ./... - go vet -tags protoopaque ./... golangci-lint run --modules-download-mode=readonly --timeout=3m0s .PHONY: lintfix From f653fbda15bb0c4294d4f47aba29cdce3b3ea78a Mon Sep 17 00:00:00 2001 From: Edward McFarlane Date: Wed, 26 Aug 2026 16:30:20 +0100 Subject: [PATCH 3/3] Update pluginrpc.com/pluginrpc --- go.mod | 14 +++++++------- go.sum | 29 ++++++++++++++--------------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 9c87178..d1ae3ab 100644 --- a/go.mod +++ b/go.mod @@ -8,24 +8,24 @@ require ( buf.build/go/spdx v0.2.0 github.com/bufbuild/protocompile v0.14.1 github.com/stretchr/testify v1.11.1 - google.golang.org/protobuf v1.36.11 - pluginrpc.com/pluginrpc v0.5.0 + google.golang.org/protobuf v1.36.12 + pluginrpc.com/pluginrpc v0.5.1-0.20260825152034-473fc805d0d1 ) require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 // indirect - buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.12-20260825204119-511051f7f437.1 // indirect + buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.12-20241007202033-cf42259fcbfc.1 // indirect cel.dev/expr v0.25.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/cel-go v0.29.0 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.24 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.10 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.31.0 // indirect + golang.org/x/sys v0.47.0 // indirect golang.org/x/text v0.28.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250811230008-5f3141c8851a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect diff --git a/go.sum b/go.sum index 126c67b..643f293 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1 h1:zQ9C3e6FtwSZUFuKAQfpIKGFk5ZuRoGt5g35Bix55sI= buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1/go.mod h1:1Znr6gmYBhbxWUPRrrVnSLXQsz8bvFVw1HHJq2bI3VQ= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 h1:PMmTMyvHScV9Mn8wc6ASge9uRcHy0jtqPd+fM35LmsQ= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM= -buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1 h1:iGPvEJltOXUMANWf0zajcRcbiOXLD90ZwPUFvbcuv6Q= -buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1/go.mod h1:nWVKKRA29zdt4uvkjka3i/y4mkrswyWwiu0TbdX0zts= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.12-20260825204119-511051f7f437.1 h1:Slv0uGxx219srASyiaI5C9cDlyG8kNDcXpTSYcuAeE4= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.12-20260825204119-511051f7f437.1/go.mod h1:TCt1lluMFnctISJXvkIQ4x3ABrPuUKCWKyjKdkJNBpw= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.12-20241007202033-cf42259fcbfc.1 h1:iXXTQ60veYbSOKfSQHT9Q3TfZxasAgTJcbo2fnNCApE= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.12-20241007202033-cf42259fcbfc.1/go.mod h1:i5fBCEtqJW2uI1OXKsCBFuZWejoPGWsDmy2ukRE3+vM= buf.build/go/protovalidate v1.1.3 h1:m2GVEgQWd7rk+vIoAZ+f0ygGjvQTuqPQapBBdcpWVPE= buf.build/go/protovalidate v1.1.3/go.mod h1:9XIuohWz+kj+9JVn3WQneHA5LZP50mjvneZMnbLkiIE= buf.build/go/spdx v0.2.0 h1:IItqM0/cMxvFJJumcBuP8NrsIzMs/UYjp/6WSpq8LTw= @@ -26,14 +26,14 @@ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.24 h1:tGZZoVgT/KiqK1c8ocVLeDS8BSWMRd47J3Lbz7vsReI= +github.com/mattn/go-isatty v0.0.24/go.mod h1:nMCL3Zebbrt45jsMDgnfIwz6ydEQApk5oEI3HqDio6A= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rodaine/protogofakeit v0.1.1 h1:ZKouljuRM3A+TArppfBqnH8tGZHOwM/pjvtXe9DaXH8= github.com/rodaine/protogofakeit v0.1.1/go.mod h1:pXn/AstBYMaSfc1/RqH3N82pBuxtWgejz1AlYpY1mI0= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= @@ -42,21 +42,20 @@ golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3 golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= google.golang.org/genproto/googleapis/api v0.0.0-20250811230008-5f3141c8851a h1:DMCgtIAIQGZqJXMVzJF4MV8BlWoJh2ZuFiRdAleyr58= google.golang.org/genproto/googleapis/api v0.0.0-20250811230008-5f3141c8851a/go.mod h1:y2yVLIE/CSMCPXaHnSKXxu1spLPnglFLegmgdY23uuE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a h1:tPE/Kp+x9dMSwUm/uM0JKK0IfdiJkwAbSMSeZBXXJXc= google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a/go.mod h1:gw1tLEfykwDz2ET4a12jcXt4couGAm7IwsVaTy0Sflo= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -pluginrpc.com/pluginrpc v0.5.0 h1:tOQj2D35hOmvHyPu8e7ohW2/QvAnEtKscy2IJYWQ2yo= -pluginrpc.com/pluginrpc v0.5.0/go.mod h1:UNWZ941hcVAoOZUn8YZsMmOZBzbUjQa3XMns8RQLp9o= +pluginrpc.com/pluginrpc v0.5.1-0.20260825152034-473fc805d0d1 h1:ijwXS090rZ+N13Rpwwz5Ku/+49aNUE73Jof1Pw/fCaw= +pluginrpc.com/pluginrpc v0.5.1-0.20260825152034-473fc805d0d1/go.mod h1:ro2Em10qmKefBGOLc9HMAjRlJwJpfBS33pqfLtLj+JI=