Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -240,9 +240,9 @@ jobs:
cache: true
cache-dependency-path: go/go.sum
- name: golangci-lint
uses: golangci/golangci-lint-action@v8
uses: golangci/golangci-lint-action@v9
with:
version: v2.5.0
version: v2.6.2
working-directory: go

python-test:
Expand Down Expand Up @@ -331,4 +331,4 @@ jobs:
git diff
exit 1
fi
echo "✓ Controller manifests are up to date"
echo "✓ Controller manifests are up to date"
109 changes: 100 additions & 9 deletions go/.golangci.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,102 @@
version: "2"

run:
go: "1.25"
timeout: 10m
allow-parallel-runners: true
linters:
# Default set of linters.
# The value can be:
# - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default
# - `all`: enables all linters by default.
# - `none`: disables all linters by default.
# - `fast`: enables only linters considered as "fast" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`).
# Default: standard
default: standard
default: none
enable:
- asasalint
- asciicheck
- bidichk
- copyloopvar
- depguard
- dogsled
- goprintffuncname
- govet
- importas
- ineffassign
- iotamixing
- makezero
- misspell
- modernize
- nakedret
- nolintlint
- staticcheck
- unused
- whitespace
settings:
depguard:
rules:
forbid-pkg-errors:
deny:
- pkg: sort
desc: Should be replaced with slices package
govet:
disable:
- fieldalignment
- shadow
enable-all: true
importas:
alias:
- pkg: k8s.io/api/core/v1
alias: corev1
- pkg: k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1
alias: apiextensionsv1
- pkg: k8s.io/apimachinery/pkg/apis/meta/v1
alias: metav1
- pkg: k8s.io/apimachinery/pkg/api/errors
alias: apierrors
- pkg: k8s.io/apimachinery/pkg/util/errors
alias: kerrors
no-unaliased: true
modernize:
disable:
- omitzero
- fmtappendf
revive:
rules:
# The following rules are recommended https://github.com/mgechev/revive#recommended-configuration
- name: blank-imports
- name: context-as-argument
- name: context-keys-type
- name: dot-imports
- name: error-return
- name: error-strings
- name: error-naming
- name: exported
- name: if-return
- name: increment-decrement
- name: var-naming
- name: var-declaration
- name: range
- name: receiver-naming
- name: time-naming
- name: unexported-return
- name: indent-error-flow
- name: errorf
- name: superfluous-else
- name: unreachable-code
- name: redefines-builtin-id
#
# Rules in addition to the recommended configuration above.
#
- name: bool-literal-in-expr
- name: constant-logical-expr
exclusions:
generated: strict
paths:
- zz_generated.*\.go$
- .*conversion.*\.go$
issues:
max-issues-per-linter: 0
max-same-issues: 0
formatters:
enable:
- gofmt
- goimports
exclusions:
generated: strict
paths:
- zz_generated.*\.go$
- .*conversion.*\.go$
1 change: 0 additions & 1 deletion go/cli/cmd/kagent/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,6 @@ Examples:

os.Exit(1)
}

}

func runInteractive(cmd *cobra.Command, args []string) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ func (g *BaseGenerator) GenerateProject(config AgentConfig) error {

// RenderTemplate renders a template string with the provided data.
// This delegates to the shared generator implementation.
func (g *BaseGenerator) RenderTemplate(tmplContent string, data interface{}) (string, error) {
func (g *BaseGenerator) RenderTemplate(tmplContent string, data any) (string, error) {
return g.BaseGenerator.RenderTemplate(tmplContent, data)
}
4 changes: 2 additions & 2 deletions go/cli/internal/cli/agent/bug_report.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ func BugReportCmd(cfg *config.Config) {
if err != nil {
fmt.Fprintf(os.Stderr, "Error getting pod names: %v\n", err)
} else {
pods := strings.Split(string(output), "\n")
for _, pod := range pods {
pods := strings.SplitSeq(string(output), "\n")
for pod := range pods {
if pod == "" {
continue
}
Expand Down
3 changes: 1 addition & 2 deletions go/cli/internal/cli/agent/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const (
DefaultModelProvider = v1alpha2.ModelProviderOpenAI
DefaultHelmOciRegistry = "oci://ghcr.io/kagent-dev/kagent/helm/"

//Provider specific env variables
// Provider specific env variables
OPENAI_API_KEY = "OPENAI_API_KEY"
ANTHROPIC_API_KEY = "ANTHROPIC_API_KEY"
AZUREOPENAI_API_KEY = "AZUREOPENAI_API_KEY"
Expand All @@ -28,7 +28,6 @@ const (
func GetModelProvider() v1alpha2.ModelProvider {
modelProvider := os.Getenv(KAGENT_DEFAULT_MODEL_PROVIDER)
if modelProvider == "" {

return DefaultModelProvider
}
switch modelProvider {
Expand Down
4 changes: 2 additions & 2 deletions go/cli/internal/cli/agent/const_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ func TestGetModelProvider(t *testing.T) {
if tc.envVarValue == "" {
os.Unsetenv(KAGENT_DEFAULT_MODEL_PROVIDER) //nolint:errcheck
} else {
os.Setenv(KAGENT_DEFAULT_MODEL_PROVIDER, tc.expectedHelmKey) //nolint:errcheck
defer os.Unsetenv(KAGENT_DEFAULT_MODEL_PROVIDER) //nolint:errcheck
os.Setenv(KAGENT_DEFAULT_MODEL_PROVIDER, tc.expectedHelmKey)
defer os.Unsetenv(KAGENT_DEFAULT_MODEL_PROVIDER) //nolint:errcheck
}

result := GetModelProvider()
Expand Down
29 changes: 14 additions & 15 deletions go/cli/internal/cli/agent/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import (
"bufio"
"context"
"fmt"
"maps"
"os"
"regexp"
"sort"
"slices"
"strings"
"time"

Expand All @@ -18,7 +19,7 @@ import (
"github.com/kagent-dev/kmcp/api/v1alpha1"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
Expand Down Expand Up @@ -246,7 +247,7 @@ func extractEnvVarsFromManifest(manifest *common.AgentManifest) []string {
for varName := range envVarSet {
envVars = append(envVars, varName)
}
sort.Strings(envVars)
slices.Sort(envVars)

return envVars
}
Expand Down Expand Up @@ -412,7 +413,7 @@ func createEnvFileSecret(ctx context.Context, k8sClient client.Client, namespace
err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: secretName}, existingSecret)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
if err := k8sClient.Create(ctx, secret); err != nil {
return fmt.Errorf("failed to create env file secret: %v", err)
}
Expand Down Expand Up @@ -447,7 +448,7 @@ func waitForDeployment(ctx context.Context, k8sClient client.Client, namespace,
for {
select {
case <-timeoutTimer.C:
return nil, errors.NewNotFound(appsv1.Resource("deployment"), name)
return nil, apierrors.NewNotFound(appsv1.Resource("deployment"), name)
case <-ticker.C:
err := k8sClient.Get(ctx, types.NamespacedName{
Name: name,
Expand All @@ -461,7 +462,7 @@ func waitForDeployment(ctx context.Context, k8sClient client.Client, namespace,
return deployment, nil
}

if !errors.IsNotFound(err) {
if !apierrors.IsNotFound(err) {
return nil, fmt.Errorf("error checking for deployment: %v", err)
}
}
Expand All @@ -475,7 +476,7 @@ func restartAgentDeployment(ctx context.Context, k8sClient client.Client, cfg *D

_, err := waitForDeployment(ctx, k8sClient, namespace, deploymentName, 30*time.Second, cfg.Config)
if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
if IsVerbose(cfg.Config) {
fmt.Printf("Deployment '%s' not found after timeout, it may still be being created by the controller\n", deploymentName)
}
Expand Down Expand Up @@ -619,7 +620,7 @@ func createOrUpdateSecret(ctx context.Context, k8sClient client.Client, secret *
}, existingSecret)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// Create new secret
if err := k8sClient.Create(ctx, secret); err != nil {
return fmt.Errorf("failed to create secret: %v", err)
Expand Down Expand Up @@ -713,7 +714,7 @@ func createOrUpdateAgent(ctx context.Context, k8sClient client.Client, agent *v1
err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, existingAgent)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// Agent does not exist, create it
if err := k8sClient.Create(ctx, agent); err != nil {
return fmt.Errorf("failed to create agent: %v", err)
Expand Down Expand Up @@ -812,7 +813,7 @@ func createOrUpdateRemoteMCPServer(ctx context.Context, k8sClient client.Client,
err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, existingRemoteMCPServer)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// Create new RemoteMCPServer
if err := k8sClient.Create(ctx, remoteMCPServer); err != nil {
return fmt.Errorf("failed to create RemoteMCPServer: %v", err)
Expand Down Expand Up @@ -900,7 +901,7 @@ func createOrUpdateMCPServer(ctx context.Context, k8sClient client.Client, mcpSe
err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: name}, existingMCPServer)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// Create new MCPServer
if err := k8sClient.Create(ctx, mcpServerResource); err != nil {
return fmt.Errorf("failed to create MCPServer: %v", err)
Expand Down Expand Up @@ -1086,7 +1087,7 @@ func createOrUpdateEnvSecret(ctx context.Context, k8sClient client.Client, names
err := k8sClient.Get(ctx, client.ObjectKey{Namespace: namespace, Name: secretName}, existingSecret)

if err != nil {
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// Secret doesn't exist, create it with all data
secret := &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{
Expand All @@ -1109,9 +1110,7 @@ func createOrUpdateEnvSecret(ctx context.Context, k8sClient client.Client, names
}

// Secret exists, merge the new data with existing data
for key, value := range secretData {
existingSecret.Data[key] = value
}
maps.Copy(existingSecret.Data, secretData)

if err := k8sClient.Update(ctx, existingSecret); err != nil {
return fmt.Errorf("failed to update existing secret: %v", err)
Expand Down
8 changes: 4 additions & 4 deletions go/cli/internal/cli/agent/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,16 @@ const (
OutputFormatTable OutputFormat = "table"
)

func printOutput(data interface{}, tableHeaders []string, tableRows [][]string) error {
func printOutput(data any, tableHeaders []string, tableRows [][]string) error {
format := OutputFormat(viper.GetString("output_format"))

tw := table.NewWriter()
headers := slices.Collect(utils.Map(slices.Values(tableHeaders), func(header string) interface{} {
headers := slices.Collect(utils.Map(slices.Values(tableHeaders), func(header string) any {
return header
}))
tw.AppendHeader(headers)
rows := slices.Collect(utils.Map(slices.Values(tableRows), func(row []string) table.Row {
return slices.Collect(utils.Map(slices.Values(row), func(cell string) interface{} {
return slices.Collect(utils.Map(slices.Values(row), func(cell string) any {
return cell
}))
}))
Expand All @@ -43,7 +43,7 @@ func printOutput(data interface{}, tableHeaders []string, tableRows [][]string)
}
}

func printJSON(data interface{}) error {
func printJSON(data any) error {
output, err := json.MarshalIndent(data, "", " ")
if err != nil {
return fmt.Errorf("error formatting JSON: %w", err)
Expand Down
4 changes: 2 additions & 2 deletions go/cli/internal/cli/agent/get.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func GetAgentCmd(cfg *config.Config, resourceName string) {
return
}
byt, _ := json.MarshalIndent(agent, "", " ")
fmt.Fprintln(os.Stdout, string(byt)) //nolint:errcheck
fmt.Fprintln(os.Stdout, string(byt))
}
}

Expand Down Expand Up @@ -69,7 +69,7 @@ func GetSessionCmd(cfg *config.Config, resourceName string) {
return
}
byt, _ := json.MarshalIndent(session, "", " ")
fmt.Fprintln(os.Stdout, string(byt)) //nolint:errcheck
fmt.Fprintln(os.Stdout, string(byt))
}
}

Expand Down
Loading
Loading