Repository: supabase/cli
Pull request #2689 (2024-09-17 02:11:11)

Prod deploy
- **fix: bump edge-runtime to 1.58.3 (#2668)**
- **feat: allow Cognito configuration from env var (#2660)**
- **fix: Health Check issue on Podman/Windows (#2656)**
- **feat: add db lint fail-on flag (#2664)**
- **feat: support delete all credentials from keyring**
- **chore: add linux tests dependency**
- **feat: db reset skip seed flag (#2665)**
- **chore(deps): bump github.com/docker/cli from 26.1.5+incompatible to 27.2.1+incompatible (#2667)**
- **chore(deps): bump golang.org/x/oauth2 from 0.21.0 to 0.23.0 (#2675)**
- **chore(deps): bump golang.org/x/term from 0.22.0 to 0.24.0 (#2676)**
- **chore(deps): bump github.com/containers/common from 0.59.2 to 0.60.2 (#2624)**
- **chore(deps): bump go.opentelemetry.io/otel from 1.28.0 to 1.30.0 (#2678)**
- **chore(deps): bump google.golang.org/grpc from 1.65.0 to 1.66.2 (#2680)**
- **chore(deps): bump github.com/slack-go/slack from 0.13.1 to 0.14.0 (#2679)**
- **feat: add support for multiple output formats (#2674)**
- **feat: add --all flag to stop command (#2672)**
- **fix: logout credentials cleanup (#2670)**



Patch:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b107b1cf..0f407815 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -18,6 +18,8 @@ jobs:
           go-version-file: go.mod
           cache: true
 
+      # Required by: internal/utils/credentials/keyring_test.go
+      - uses: t1m0thyj/unlock-keyring@v1
       - run: |
           go run gotest.tools/gotestsum -- ./... -race -v -count=1 \
           -coverpkg ./cmd/...,./internal/... -coverprofile=coverage.out
diff --git a/cmd/db.go b/cmd/db.go
index e2b109a2..2ddb4072 100644
--- a/cmd/db.go
+++ b/cmd/db.go
@@ -183,10 +183,15 @@ var (
 		},
 	}
 
+	noSeed bool
+
 	dbResetCmd = &cobra.Command{
 		Use:   "reset",
 		Short: "Resets the local database to current migrations",
 		RunE: func(cmd *cobra.Command, args []string) error {
+			if noSeed {
+				utils.Config.Db.Seed.Enabled = false
+			}
 			return reset.Run(cmd.Context(), migrationVersion, flags.DbConfig, afero.NewOsFs())
 		},
 	}
@@ -196,11 +201,16 @@ var (
 		Value:   lint.AllowedLevels[0],
 	}
 
+	lintFailOn = utils.EnumFlag{
+		Allowed: append([]string{"none"}, lint.AllowedLevels...),
+		Value:   "none",
+	}
+
 	dbLintCmd = &cobra.Command{
 		Use:   "lint",
 		Short: "Checks local database for typing error",
 		RunE: func(cmd *cobra.Command, args []string) error {
-			return lint.Run(cmd.Context(), schema, level.Value, flags.DbConfig, afero.NewOsFs())
+			return lint.Run(cmd.Context(), schema, level.Value, lintFailOn.Value, flags.DbConfig, afero.NewOsFs())
 		},
 	}
 
@@ -299,6 +309,7 @@ func init() {
 	resetFlags.String("db-url", "", "Resets the database specified by the connection string (must be percent-encoded).")
 	resetFlags.Bool("linked", false, "Resets the linked project with local migrations.")
 	resetFlags.Bool("local", true, "Resets the local database with local migrations.")
+	resetFlags.BoolVar(&noSeed, "no-seed", false, "Skip running the seed script after reset.")
 	dbResetCmd.MarkFlagsMutuallyExclusive("db-url", "linked", "local")
 	resetFlags.StringVar(&migrationVersion, "version", "", "Reset up to the specified version.")
 	dbCmd.AddCommand(dbResetCmd)
@@ -310,6 +321,7 @@ func init() {
 	dbLintCmd.MarkFlagsMutuallyExclusive("db-url", "linked", "local")
 	lintFlags.StringSliceVarP(&schema, "schema", "s", []string{}, "Comma separated list of schema to include.")
 	lintFlags.Var(&level, "level", "Error level to emit.")
+	lintFlags.Var(&lintFailOn, "fail-on", "Error level to exit with non-zero status.")
 	dbCmd.AddCommand(dbLintCmd)
 	// Build start command
 	dbCmd.AddCommand(dbStartCmd)
diff --git a/cmd/root.go b/cmd/root.go
index de3b9375..f7caa54f 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -243,6 +243,7 @@ func init() {
 	flags.String("workdir", "", "path to a Supabase project directory")
 	flags.Bool("experimental", false, "enable experimental features")
 	flags.String("network-id", "", "use the specified docker network instead of a generated one")
+	flags.Var(&utils.OutputFormat, "output", "output format of status variables")
 	flags.Var(&utils.DNSResolver, "dns-resolver", "lookup domain names using the specified resolver")
 	flags.BoolVar(&createTicket, "create-ticket", false, "create a support ticket for any CLI error")
 	cobra.CheckErr(viper.BindPFlags(flags))
diff --git a/cmd/sso.go b/cmd/sso.go
index 766c749f..a9b4db7d 100644
--- a/cmd/sso.go
+++ b/cmd/sso.go
@@ -33,10 +33,6 @@ var (
 	ssoDomains              []string
 	ssoAddDomains           []string
 	ssoRemoveDomains        []string
-	ssoOutput               = utils.EnumFlag{
-		Allowed: utils.OutputDefaultAllowed,
-		Value:   utils.OutputPretty,
-	}
 
 	ssoAddCmd = &cobra.Command{
 		Use:     "add",
@@ -47,7 +43,7 @@ var (
 			return create.Run(cmd.Context(), create.RunParams{
 				ProjectRef:        flags.ProjectRef,
 				Type:              ssoProviderType.String(),
-				Format:            ssoOutput.Value,
+				Format:            utils.OutputFormat.Value,
 				MetadataFile:      ssoMetadataFile,
 				MetadataURL:       ssoMetadataURL,
 				SkipURLValidation: ssoSkipURLValidation,
@@ -68,7 +64,7 @@ var (
 				return errors.Errorf("identity provider ID %q is not a UUID", args[0])
 			}
 
-			return remove.Run(cmd.Context(), flags.ProjectRef, args[0], ssoOutput.Value)
+			return remove.Run(cmd.Context(), flags.ProjectRef, args[0], utils.OutputFormat.Value)
 		},
 	}
 
@@ -86,7 +82,7 @@ var (
 			return update.Run(cmd.Context(), update.RunParams{
 				ProjectRef: flags.ProjectRef,
 				ProviderID: args[0],
-				Format:     ssoOutput.Value,
+				Format:     utils.OutputFormat.Value,
 
 				MetadataFile:      ssoMetadataFile,
 				MetadataURL:       ssoMetadataURL,
@@ -110,7 +106,7 @@ var (
 				return errors.Errorf("identity provider ID %q is not a UUID", args[0])
 			}
 
-			format := ssoOutput.Value
+			format := utils.OutputFormat.Value
 			if ssoMetadata {
 				format = utils.OutputMetadata
 			}
@@ -125,7 +121,7 @@ var (
 		Long:    "List all connections to a SSO identity provider to your Supabase project.",
 		Example: `  supabase sso list --project-ref mwjylndxudmiehsxhmmz`,
 		RunE: func(cmd *cobra.Command, args []string) error {
-			return list.Run(cmd.Context(), flags.ProjectRef, ssoOutput.Value)
+			return list.Run(cmd.Context(), flags.ProjectRef, utils.OutputFormat.Value)
 		},
 	}
 
@@ -135,7 +131,7 @@ var (
 		Long:    "Returns all of the important SSO information necessary for your project to be registered with a SAML 2.0 compatible identity provider.",
 		Example: `  supabase sso info --project-ref mwjylndxudmiehsxhmmz`,
 		RunE: func(cmd *cobra.Command, args []string) error {
-			return info.Run(cmd.Context(), flags.ProjectRef, ssoOutput.Value)
+			return info.Run(cmd.Context(), flags.ProjectRef, utils.OutputFormat.Value)
 		},
 	}
 )
@@ -143,7 +139,6 @@ var (
 func init() {
 	persistentFlags := ssoCmd.PersistentFlags()
 	persistentFlags.StringVar(&flags.ProjectRef, "project-ref", "", "Project ref of the Supabase project.")
-	persistentFlags.VarP(&ssoOutput, "output", "o", "Output format")
 	ssoAddFlags := ssoAddCmd.Flags()
 	ssoAddFlags.VarP(&ssoProviderType, "type", "t", "Type of identity provider (according to supported protocol).")
 	ssoAddFlags.StringSliceVar(&ssoDomains, "domains", nil, "Comma separated list of email domains to associate with the added identity provider.")
diff --git a/cmd/start.go b/cmd/start.go
index b3cba1a4..ae3faf01 100644
--- a/cmd/start.go
+++ b/cmd/start.go
@@ -1,13 +1,39 @@
 package cmd
 
 import (
+	"fmt"
+	"os"
+	"sort"
 	"strings"
 
 	"github.com/spf13/afero"
 	"github.com/spf13/cobra"
 	"github.com/supabase/cli/internal/start"
+	"github.com/supabase/cli/internal/utils"
 )
 
+func validateExcludedContainers(excludedContainers []string) {
+	// Validate excluded containers
+	validContainers := start.ExcludableContainers()
+	var invalidContainers []string
+
+	for _, e := range excludedContainers {
+		if !utils.SliceContains(validContainers, e) {
+			invalidContainers = append(invalidContainers, e)
+		}
+	}
+
+	if len(invalidContainers) > 0 {
+		// Sort the names list so it's easier to visually spot the one you looking for
+		sort.Strings(validContainers)
+		warning := fmt.Sprintf("%s The following container names are not valid to exclude: %s\nValid containers to exclude are: %s\n",
+			utils.Yellow("Warning:"),
+			utils.Aqua(strings.Join(invalidContainers, ", ")),
+			utils.Aqua(strings.Join(validContainers, ", ")))
+		fmt.Fprint(os.Stderr, warning)
+	}
+}
+
 var (
 	allowedContainers  = start.ExcludableContainers()
 	excludedContainers []string
@@ -19,6 +45,7 @@ var (
 		Use:     "start",
 		Short:   "Start containers for Supabase local development",
 		RunE: func(cmd *cobra.Command, args []string) error {
+			validateExcludedContainers(excludedContainers)
 			return start.Run(cmd.Context(), afero.NewOsFs(), excludedContainers, ignoreHealthCheck)
 		},
 	}
diff --git a/cmd/status.go b/cmd/status.go
index 5f131c90..13540bfb 100644
--- a/cmd/status.go
+++ b/cmd/status.go
@@ -18,6 +18,7 @@ var (
 		Allowed: append([]string{utils.OutputEnv}, utils.OutputDefaultAllowed...),
 		Value:   utils.OutputPretty,
 	}
+
 	statusCmd = &cobra.Command{
 		GroupID: groupLocalDev,
 		Use:     "status",
diff --git a/cmd/stop.go b/cmd/stop.go
index 19401326..6a6f4aa5 100644
--- a/cmd/stop.go
+++ b/cmd/stop.go
@@ -12,6 +12,7 @@ import (
 var (
 	noBackup  bool
 	projectId string
+	all       bool
 
 	stopCmd = &cobra.Command{
 		GroupID: groupLocalDev,
@@ -19,7 +20,7 @@ var (
 		Short:   "Stop all local Supabase containers",
 		RunE: func(cmd *cobra.Command, args []string) error {
 			ctx, _ := signal.NotifyContext(cmd.Context(), os.Interrupt)
-			return stop.Run(ctx, !noBackup, projectId, afero.NewOsFs())
+			return stop.Run(ctx, !noBackup, projectId, all, afero.NewOsFs())
 		},
 	}
 )
@@ -30,5 +31,7 @@ func init() {
 	flags.StringVar(&projectId, "project-id", "", "Local project ID to stop.")
 	cobra.CheckErr(flags.MarkHidden("backup"))
 	flags.BoolVar(&noBackup, "no-backup", false, "Deletes all data volumes after stopping.")
+	flags.BoolVar(&all, "all", false, "Stop all local Supabase instances from all projects across the machine.")
+	stopCmd.MarkFlagsMutuallyExclusive("project-id", "all")
 	rootCmd.AddCommand(stopCmd)
 }
diff --git a/docs/supabase/db/lint.md b/docs/supabase/db/lint.md
index 33415dc2..3718d2d3 100644
--- a/docs/supabase/db/lint.md
+++ b/docs/supabase/db/lint.md
@@ -7,3 +7,11 @@ Requires the local development stack to be running when linting against the loca
 Runs `plpgsql_check` extension in the local Postgres container to check for errors in all schemas. The default lint level is `warning` and can be raised to error via the `--level` flag.
 
 To lint against specific schemas only, pass in the `--schema` flag.
+
+The `--fail-on` flag can be used to control when the command should exit with a non-zero status code. The possible values are:
+
+- `none` (default): Always exit with a zero status code, regardless of lint results.
+- `warning`: Exit with a non-zero status code if any warnings or errors are found.
+- `error`: Exit with a non-zero status code only if errors are found.
+
+This flag is particularly useful in CI/CD pipelines where you want to fail the build based on certain lint conditions.
\ No newline at end of file
diff --git a/docs/supabase/stop.md b/docs/supabase/stop.md
index e18261ab..870fa860 100644
--- a/docs/supabase/stop.md
+++ b/docs/supabase/stop.md
@@ -5,3 +5,5 @@ Stops the Supabase local development stack.
 Requires `supabase/config.toml` to be created in your current working directory by running `supabase init`.
 
 All Docker resources are maintained across restarts.  Use `--no-backup` flag to reset your local development data between restarts.
+
+Use the `--all` flag to stop all local Supabase projects instances on the machine. Use with caution with `--no-backup` as it will delete all supabase local projects data.
\ No newline at end of file
diff --git a/go.mod b/go.mod
index fe4ede74..1d790e82 100644
--- a/go.mod
+++ b/go.mod
@@ -11,10 +11,11 @@ require (
 	github.com/charmbracelet/bubbletea v0.25.0
 	github.com/charmbracelet/glamour v0.7.0
 	github.com/charmbracelet/lipgloss v0.12.1
-	github.com/containers/common v0.59.2
+	github.com/containers/common v0.60.2
+	github.com/danieljoos/wincred v1.2.1
 	github.com/deepmap/oapi-codegen/v2 v2.2.0
-	github.com/docker/cli v26.1.5+incompatible
-	github.com/docker/docker v26.1.5+incompatible
+	github.com/docker/cli v27.2.1+incompatible
+	github.com/docker/docker v27.2.1+incompatible
 	github.com/docker/go-connections v0.5.0
 	github.com/docker/go-units v0.5.0
 	github.com/getsentry/sentry-go v0.28.1
@@ -39,7 +40,7 @@ require (
 	github.com/mitchellh/mapstructure v1.5.0
 	github.com/muesli/reflow v0.3.0
 	github.com/oapi-codegen/runtime v1.1.1
-	github.com/slack-go/slack v0.13.1
+	github.com/slack-go/slack v0.14.0
 	github.com/spf13/afero v1.11.0
 	github.com/spf13/cobra v1.8.1
 	github.com/spf13/pflag v1.0.5
@@ -48,11 +49,11 @@ require (
 	github.com/stripe/pg-schema-diff v0.7.0
 	github.com/withfig/autocomplete-tools/packages/cobra v1.2.0
 	github.com/zalando/go-keyring v0.2.5
-	go.opentelemetry.io/otel v1.28.0
-	golang.org/x/mod v0.20.0
-	golang.org/x/oauth2 v0.21.0
-	golang.org/x/term v0.22.0
-	google.golang.org/grpc v1.65.0
+	go.opentelemetry.io/otel v1.30.0
+	golang.org/x/mod v0.21.0
+	golang.org/x/oauth2 v0.23.0
+	golang.org/x/term v0.24.0
+	google.golang.org/grpc v1.66.2
 	gopkg.in/yaml.v3 v3.0.1
 	gotest.tools/gotestsum v1.12.0
 )
@@ -110,18 +111,17 @@ require (
 	github.com/cloudwego/iasm v0.2.0 // indirect
 	github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
 	github.com/containerd/log v0.1.0 // indirect
-	github.com/containers/storage v1.54.0 // indirect
+	github.com/containers/storage v1.55.0 // indirect
 	github.com/curioswitch/go-reassign v0.2.0 // indirect
-	github.com/cyphar/filepath-securejoin v0.2.5 // indirect
+	github.com/cyphar/filepath-securejoin v0.3.1 // indirect
 	github.com/daixiang0/gci v0.13.4 // indirect
-	github.com/danieljoos/wincred v1.2.1 // indirect
 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/denis-tingaikin/go-header v0.5.0 // indirect
 	github.com/distribution/reference v0.6.0 // indirect
 	github.com/dlclark/regexp2 v1.4.0 // indirect
 	github.com/dnephin/pflag v1.0.7 // indirect
 	github.com/docker/distribution v2.8.3+incompatible // indirect
-	github.com/docker/docker-credential-helpers v0.8.1 // indirect
+	github.com/docker/docker-credential-helpers v0.8.2 // indirect
 	github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect
 	github.com/docker/go-metrics v0.0.1 // indirect
 	github.com/emirpasic/gods v1.18.1 // indirect
@@ -225,7 +225,7 @@ require (
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-localereader v0.0.1 // indirect
-	github.com/mattn/go-runewidth v0.0.15 // indirect
+	github.com/mattn/go-runewidth v0.0.16 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
 	github.com/mgechev/revive v1.3.7 // indirect
 	github.com/microcosm-cc/bluemonday v1.0.25 // indirect
@@ -322,24 +322,24 @@ require (
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect
-	go.opentelemetry.io/otel/metric v1.28.0 // indirect
+	go.opentelemetry.io/otel/metric v1.30.0 // indirect
 	go.opentelemetry.io/otel/sdk v1.28.0 // indirect
 	go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect
-	go.opentelemetry.io/otel/trace v1.28.0 // indirect
+	go.opentelemetry.io/otel/trace v1.30.0 // indirect
 	go.opentelemetry.io/proto/otlp v1.3.1 // indirect
 	go.uber.org/atomic v1.9.0 // indirect
 	go.uber.org/automaxprocs v1.5.3 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
 	go.uber.org/zap v1.24.0 // indirect
 	golang.org/x/arch v0.8.0 // indirect
-	golang.org/x/crypto v0.24.0 // indirect
-	golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
+	golang.org/x/crypto v0.26.0 // indirect
+	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
 	golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
-	golang.org/x/net v0.26.0 // indirect
-	golang.org/x/sync v0.7.0 // indirect
-	golang.org/x/sys v0.22.0 // indirect
-	golang.org/x/text v0.16.0 // indirect
-	golang.org/x/tools v0.22.0 // indirect
+	golang.org/x/net v0.28.0 // indirect
+	golang.org/x/sync v0.8.0 // indirect
+	golang.org/x/sys v0.25.0 // indirect
+	golang.org/x/text v0.17.0 // indirect
+	golang.org/x/tools v0.24.0 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
 	google.golang.org/protobuf v1.34.2 // indirect
diff --git a/go.sum b/go.sum
index 9dcf2a2a..4fdaab3f 100644
--- a/go.sum
+++ b/go.sum
@@ -200,10 +200,10 @@ github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2
 github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
 github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
 github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
-github.com/containers/common v0.59.2 h1:FcURZzlMYMVZXqjMEop6C0A3yWilrfmWUPUw09APHvI=
-github.com/containers/common v0.59.2/go.mod h1:/PHpbapKSHQU29Jmjn3Ld3jekoHvX0zx7qQxxyPqSTM=
-github.com/containers/storage v1.54.0 h1:xwYAlf6n9OnIlURQLLg3FYHbO74fQ/2W2N6EtQEUM4I=
-github.com/containers/storage v1.54.0/go.mod h1:PlMOoinRrBSnhYODLxt4EXl0nmJt+X0kjG0Xdt9fMTw=
+github.com/containers/common v0.60.2 h1:utcwp2YkO8c0mNlwRxsxfOiqfj157FRrBjxgjR6f+7o=
+github.com/containers/common v0.60.2/go.mod h1:I0upBi1qJX3QmzGbUOBN1LVP6RvkKhd3qQpZbQT+Q54=
+github.com/containers/storage v1.55.0 h1:wTWZ3YpcQf1F+dSP4KxG9iqDfpQY1otaUXjPpffuhgg=
+github.com/containers/storage v1.55.0/go.mod h1:28cB81IDk+y7ok60Of6u52RbCeBRucbFOeLunhER1RQ=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
@@ -213,8 +213,8 @@ github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
 github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo=
 github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc=
-github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo=
-github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE=
+github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc=
 github.com/daixiang0/gci v0.13.4 h1:61UGkmpoAcxHM2hhNkZEf5SzwQtWJXTSws7jaPyqwlw=
 github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
 github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs=
@@ -234,15 +234,15 @@ github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E
 github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
 github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
-github.com/docker/cli v26.1.5+incompatible h1:NxXGSdz2N+Ibdaw330TDO3d/6/f7MvHuiMbuFaIQDTk=
-github.com/docker/cli v26.1.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/cli v27.2.1+incompatible h1:U5BPtiD0viUzjGAjV1p0MGB8eVA3L3cbIrnyWmSJI70=
+github.com/docker/cli v27.2.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
 github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g=
-github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo=
-github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
+github.com/docker/docker v27.2.1+incompatible h1:fQdiLfW7VLscyoeYEBz7/J8soYFDZV1u6VW6gJEjNMI=
+github.com/docker/docker v27.2.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo=
+github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M=
 github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0=
 github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q=
 github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
@@ -468,8 +468,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
-github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
-github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
+github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
+github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
@@ -697,8 +697,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J
 github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
-github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
-github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -763,12 +763,12 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU=
 github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
-github.com/onsi/ginkgo/v2 v2.18.0 h1:W9Y7IWXxPUpAit9ieMOLI7PJZGaW22DTKgiVAuhDTLc=
-github.com/onsi/ginkgo/v2 v2.18.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw=
+github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
-github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
-github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
@@ -900,8 +900,8 @@ github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak=
 github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg=
 github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
 github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
-github.com/slack-go/slack v0.13.1 h1:6UkM3U1OnbhPsYeb1IMkQ6HSNOSikWluwOncJt4Tz/o=
-github.com/slack-go/slack v0.13.1/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
+github.com/slack-go/slack v0.14.0 h1:6c0UTfbRnvRssZUsZ2qe0Iu07VAMPjRqOa6oX8ewF4k=
+github.com/slack-go/slack v0.14.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
 github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00=
 github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo=
 github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
@@ -1028,8 +1028,8 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
-go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
-go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts=
+go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc=
 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk=
 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
@@ -1038,14 +1038,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6Z
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
-go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
-go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
+go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w=
+go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
 go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
 go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
 go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
 go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
-go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
-go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc=
+go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o=
 go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
 go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1096,8 +1096,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
 golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
 golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
-golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
-golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
+golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
+golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1108,8 +1108,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
 golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
 golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8=
@@ -1146,8 +1146,8 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
-golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
+golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1195,16 +1195,16 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
-golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
-golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
+golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
+golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1220,8 +1220,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1291,8 +1291,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
+golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -1307,8 +1307,8 @@ golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
 golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
 golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
 golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
-golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
-golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4=
+golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
+golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1325,8 +1325,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
-golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
+golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1403,8 +1403,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
 golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
 golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
-golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
-golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
+golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
+golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1479,8 +1479,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa
 google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
 google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
 google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
-google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
+google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo=
+google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
diff --git a/internal/db/branch/create/create.go b/internal/db/branch/create/create.go
index 98996e8c..085e10f9 100644
--- a/internal/db/branch/create/create.go
+++ b/internal/db/branch/create/create.go
@@ -9,7 +9,7 @@ import (
 	"os"
 	"path/filepath"
 
-	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/stdcopy"
 	"github.com/go-errors/errors"
 	"github.com/spf13/afero"
@@ -70,7 +70,7 @@ func assertNewBranchIsValid(branchPath string, fsys afero.Fs) error {
 }
 
 func createBranch(ctx context.Context, branch string) error {
-	exec, err := utils.Docker.ContainerExecCreate(ctx, utils.DbId, types.ExecConfig{
+	exec, err := utils.Docker.ContainerExecCreate(ctx, utils.DbId, container.ExecOptions{
 		Cmd:          []string{"/bin/bash", "-c", cloneScript},
 		Env:          []string{"DB_NAME=" + branch},
 		AttachStderr: true,
@@ -80,7 +80,7 @@ func createBranch(ctx context.Context, branch string) error {
 		return err
 	}
 	// Read exec output
-	resp, err := utils.Docker.ContainerExecAttach(ctx, exec.ID, types.ExecStartCheck{})
+	resp, err := utils.Docker.ContainerExecAttach(ctx, exec.ID, container.ExecStartOptions{})
 	if err != nil {
 		return err
 	}
diff --git a/internal/db/branch/delete/delete.go b/internal/db/branch/delete/delete.go
index a3bfde6f..f59f5e51 100644
--- a/internal/db/branch/delete/delete.go
+++ b/internal/db/branch/delete/delete.go
@@ -7,7 +7,7 @@ import (
 	"io"
 	"path/filepath"
 
-	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/pkg/stdcopy"
 	"github.com/go-errors/errors"
 	"github.com/spf13/afero"
@@ -58,7 +58,7 @@ func deleteBranchDir(branch string, fsys afero.Fs) error {
 }
 
 func deleteBranchPG(ctx context.Context, branch string) error {
-	exec, err := utils.Docker.ContainerExecCreate(ctx, utils.DbId, types.ExecConfig{
+	exec, err := utils.Docker.ContainerExecCreate(ctx, utils.DbId, container.ExecOptions{
 		Cmd:          []string{"dropdb", "--username", "postgres", "--host", "127.0.0.1", branch},
 		AttachStderr: true,
 		AttachStdout: true,
@@ -67,7 +67,7 @@ func deleteBranchPG(ctx context.Context, branch string) error {
 		return err
 	}
 	// Read exec output
-	resp, err := utils.Docker.ContainerExecAttach(ctx, exec.ID, types.ExecStartCheck{})
+	resp, err := utils.Docker.ContainerExecAttach(ctx, exec.ID, container.ExecStartOptions{})
 	if err != nil {
 		return err
 	}
diff --git a/internal/db/lint/lint.go b/internal/db/lint/lint.go
index dc302600..5701d89b 100644
--- a/internal/db/lint/lint.go
+++ b/internal/db/lint/lint.go
@@ -39,7 +39,7 @@ func toEnum(level string) LintLevel {
 	return -1
 }
 
-func Run(ctx context.Context, schema []string, level string, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error {
+func Run(ctx context.Context, schema []string, level string, failOn string, config pgconn.Config, fsys afero.Fs, options ...func(*pgx.ConnConfig)) error {
 	// Sanity checks.
 	conn, err := utils.ConnectByConfig(ctx, config, options...)
 	if err != nil {
@@ -55,7 +55,26 @@ func Run(ctx context.Context, schema []string, level string, config pgconn.Confi
 		fmt.Fprintln(os.Stderr, "\nNo schema errors found")
 		return nil
 	}
-	return printResultJSON(result, toEnum(level), os.Stdout)
+
+	// Apply filtering based on the minimum level
+	minLevel := toEnum(level)
+	filtered := filterResult(result, minLevel)
+	err = printResultJSON(filtered, os.Stdout)
+	if err != nil {
+		return err
+	}
+	// Check for fail-on condition
+	failOnLevel := toEnum(failOn)
+	if failOnLevel != -1 {
+		for _, r := range filtered {
+			for _, issue := range r.Issues {
+				if toEnum(issue.Level) >= failOnLevel {
+					return fmt.Errorf("fail-on is set to %s, non-zero exit", AllowedLevels[failOnLevel])
+				}
+			}
+		}
+	}
+	return nil
 }
 
 func filterResult(result []Result, minLevel LintLevel) (filtered []Result) {
@@ -73,15 +92,14 @@ func filterResult(result []Result, minLevel LintLevel) (filtered []Result) {
 	return filtered
 }
 
-func printResultJSON(result []Result, minLevel LintLevel, stdout io.Writer) error {
-	filtered := filterResult(result, minLevel)
-	if len(filtered) == 0 {
+func printResultJSON(result []Result, stdout io.Writer) error {
+	if len(result) == 0 {
 		return nil
 	}
 	// Pretty print output
 	enc := json.NewEncoder(stdout)
 	enc.SetIndent("", "  ")
-	if err := enc.Encode(filtered); err != nil {
+	if err := enc.Encode(result); err != nil {
 		return errors.Errorf("failed to print result json: %w", err)
 	}
 	return nil
diff --git a/internal/db/start/start.go b/internal/db/start/start.go
index 14c2e9a1..3039b04d 100644
--- a/internal/db/start/start.go
+++ b/internal/db/start/start.go
@@ -45,7 +45,7 @@ func Run(ctx context.Context, fsys afero.Fs) error {
 	utils.Config.Analytics.Enabled = false
 	err := StartDatabase(ctx, fsys, os.Stderr)
 	if err != nil {
-		if err := utils.DockerRemoveAll(context.Background(), os.Stderr); err != nil {
+		if err := utils.DockerRemoveAll(context.Background(), os.Stderr, utils.Config.ProjectId); err != nil {
 			fmt.Fprintln(os.Stderr, err)
 		}
 	}
@@ -237,7 +237,7 @@ func initRealtimeJob(host string) utils.DockerJob {
 			"SECRET_KEY_BASE=" + utils.Config.Realtime.SecretKeyBase,
 			"ERL_AFLAGS=" + utils.ToRealtimeEnv(utils.Config.Realtime.IpVersion),
 			"DNS_NODES=''",
-			"RLIMIT_NOFILE=10000",
+			"RLIMIT_NOFILE=",
 			"SEED_SELF_HOST=true",
 			fmt.Sprintf("MAX_HEADER_LENGTH=%d", utils.Config.Realtime.MaxHeaderLength),
 		},
diff --git a/internal/functions/deploy/deploy.go b/internal/functions/deploy/deploy.go
index 8cbfbd0e..fbed1313 100644
--- a/internal/functions/deploy/deploy.go
+++ b/internal/functions/deploy/deploy.go
@@ -16,6 +16,7 @@ import (
 
 func Run(ctx context.Context, slugs []string, projectRef string, noVerifyJWT *bool, importMapPath string, fsys afero.Fs) error {
 	// Load function config and project id
+	var skippedFunctions []string
 	if err := utils.LoadConfigFS(fsys); err != nil {
 		return err
 	} else if len(slugs) > 0 {
@@ -24,9 +25,12 @@ func Run(ctx context.Context, slugs []string, projectRef string, noVerifyJWT *bo
 				return err
 			}
 		}
-	} else if slugs, err = GetFunctionSlugs(fsys); err != nil {
+	} else if slugs, skippedFunctions, err = GetFunctionSlugs(fsys); err != nil {
 		return err
 	}
+	if len(skippedFunctions) > 0 {
+		fmt.Fprintf(utils.GetDebugLogger(), "Skipped deploying the following functions: %s\n", strings.Join(skippedFunctions, ", "))
+	}
 	// TODO: require all functions to be deployed from config for v2
 	if len(slugs) == 0 {
 		return errors.Errorf("No Functions specified or found in %s", utils.Bold(utils.FunctionsDir))
@@ -45,20 +49,23 @@ func Run(ctx context.Context, slugs []string, projectRef string, noVerifyJWT *bo
 	return nil
 }
 
-func GetFunctionSlugs(fsys afero.Fs) ([]string, error) {
+func GetFunctionSlugs(fsys afero.Fs) (slugs []string, disabledSlugs []string, err error) {
 	pattern := filepath.Join(utils.FunctionsDir, "*", "index.ts")
 	paths, err := afero.Glob(fsys, pattern)
 	if err != nil {
-		return nil, errors.Errorf("failed to glob function slugs: %w", err)
+		return nil, nil, errors.Errorf("failed to glob function slugs: %w", err)
 	}
-	var slugs []string
 	for _, path := range paths {
 		slug := filepath.Base(filepath.Dir(path))
 		if utils.FuncSlugPattern.MatchString(slug) {
-			slugs = append(slugs, slug)
+			if isFunctionEnabled(slug) {
+				slugs = append(slugs, slug)
+			} else {
+				disabledSlugs = append(disabledSlugs, slug)
+			}
 		}
 	}
-	return slugs, nil
+	return slugs, disabledSlugs, nil
 }
 
 func GetFunctionConfig(slugs []string, importMapPath string, noVerifyJWT *bool, fsys afero.Fs) (config.FunctionConfig, error) {
@@ -93,3 +100,9 @@ func GetFunctionConfig(slugs []string, importMapPath string, noVerifyJWT *bool,
 	}
 	return functionConfig, nil
 }
+
+func isFunctionEnabled(slug string) bool {
+	functionConfig := utils.Config.Functions[slug]
+	// If the function config Enabled is not defined, or defined and set to true
+	return functionConfig.Enabled == nil || *functionConfig.Enabled
+}
diff --git a/internal/functions/serve/serve.go b/internal/functions/serve/serve.go
index 3b6f8511..316f7c4a 100644
--- a/internal/functions/serve/serve.go
+++ b/internal/functions/serve/serve.go
@@ -209,10 +209,13 @@ func parseEnvFile(envFilePath string, fsys afero.Fs) ([]string, error) {
 }
 
 func populatePerFunctionConfigs(cwd, importMapPath string, noVerifyJWT *bool, fsys afero.Fs) ([]string, string, error) {
-	slugs, err := deploy.GetFunctionSlugs(fsys)
+	slugs, skippedFunctions, err := deploy.GetFunctionSlugs(fsys)
 	if err != nil {
 		return nil, "", err
 	}
+	if len(skippedFunctions) > 0 {
+		fmt.Fprintf(utils.GetDebugLogger(), "Skipped serving the following functions: %s\n", strings.Join(skippedFunctions, ", "))
+	}
 	functionsConfig, err := deploy.GetFunctionConfig(slugs, importMapPath, noVerifyJWT, fsys)
 	if err != nil {
 		return nil, "", err
diff --git a/internal/hostnames/common.go b/internal/hostnames/common.go
index 4ec371da..c01e6a0d 100644
--- a/internal/hostnames/common.go
+++ b/internal/hostnames/common.go
@@ -104,7 +104,6 @@ Please ensure that your custom domain is set up as a CNAME record to your Supaba
 		if err != nil {
 			return "", errors.Errorf("failed to deserialize body: %w", err)
 		}
-		owner := res.Result.OwnershipVerification
 		ssl := res.Result.Ssl.ValidationRecords
 		if res.Result.Ssl.Status == "initializing" {
 			return appendRawOutputIfNeeded("Custom hostname setup is being initialized; please request re-verification in a few seconds.\n", response, includeRawOutput), nil
@@ -124,11 +123,8 @@ Please ensure that your custom domain is set up as a CNAME record to your Supaba
 			return "", errors.Errorf("expected a single SSL verification record, received: %+v", ssl)
 		}
 		records := ""
-		if owner.Name != "" {
-			records = fmt.Sprintf("\n\t%s TXT -> %s", owner.Name, owner.Value)
-		}
 		if ssl[0].TxtName != "" {
-			records = fmt.Sprintf("%s\n\t%s TXT -> %s (replace any existing CNAME records)", records, ssl[0].TxtName, ssl[0].TxtValue)
+			records = fmt.Sprintf("%s\n\t%s TXT -> %s", records, ssl[0].TxtName, ssl[0].TxtValue)
 		}
 		status := fmt.Sprintf("Custom hostname verification in-progress; please configure the appropriate DNS entries and request re-verification.\n"+
 			"Required outstanding validation records: %s\n",
diff --git a/internal/init/templates/.vscode/settings.json b/internal/init/templates/.vscode/settings.json
index 5d0c9ed1..af62c23f 100644
--- a/internal/init/templates/.vscode/settings.json
+++ b/internal/init/templates/.vscode/settings.json
@@ -3,7 +3,21 @@
     "supabase/functions"
   ],
   "deno.lint": true,
-  "deno.unstable": true,
+  "deno.unstable": [
+    "bare-node-builtins",
+    "byonm",
+    "sloppy-imports",
+    "unsafe-proto",
+    "webgpu",
+    "broadcast-channel",
+    "worker-options",
+    "cron",
+    "kv",
+    "ffi",
+    "fs",
+    "http",
+    "net"
+  ],
   "[typescript]": {
     "editor.defaultFormatter": "denoland.vscode-deno"
   }
diff --git a/internal/link/link.go b/internal/link/link.go
index 9113f543..3a283107 100644
--- a/internal/link/link.go
+++ b/internal/link/link.go
@@ -43,7 +43,7 @@ func Run(ctx context.Context, projectRef string, fsys afero.Fs, options ...func(
 			return err
 		}
 		// Save database password
-		if err := credentials.Set(projectRef, config.Password); err != nil {
+		if err := credentials.StoreProvider.Set(projectRef, config.Password); err != nil {
 			fmt.Fprintln(os.Stderr, "Failed to save database password:", err)
 		}
 	}
diff --git a/internal/logout/logout.go b/internal/logout/logout.go
index c117abd9..abbd191b 100644
--- a/internal/logout/logout.go
+++ b/internal/logout/logout.go
@@ -8,6 +8,7 @@ import (
 	"github.com/go-errors/errors"
 	"github.com/spf13/afero"
 	"github.com/supabase/cli/internal/utils"
+	"github.com/supabase/cli/internal/utils/credentials"
 )
 
 func Run(ctx context.Context, stdout *os.File, fsys afero.Fs) error {
@@ -24,6 +25,11 @@ func Run(ctx context.Context, stdout *os.File, fsys afero.Fs) error {
 		return err
 	}
 
+	// Delete all possible stored project credentials
+	if err := credentials.StoreProvider.DeleteAll(); err != nil {
+		fmt.Fprintln(utils.GetDebugLogger(), err)
+	}
+
 	fmt.Fprintln(stdout, "Access token deleted successfully. You are now logged out.")
 	return nil
 }
diff --git a/internal/migration/apply/apply.go b/internal/migration/apply/apply.go
index c9df3cac..44195297 100644
--- a/internal/migration/apply/apply.go
+++ b/internal/migration/apply/apply.go
@@ -20,6 +20,9 @@ func MigrateAndSeed(ctx context.Context, version string, conn *pgx.Conn, fsys af
 	if err := migration.ApplyMigrations(ctx, migrations, conn, afero.NewIOFS(fsys)); err != nil {
 		return err
 	}
+	if !utils.Config.Db.Seed.Enabled {
+		return nil
+	}
 	return SeedDatabase(ctx, conn, fsys)
 }
 
diff --git a/internal/projects/apiKeys/api_keys.go b/internal/projects/apiKeys/api_keys.go
index 2561e1d6..4fcbfe06 100644
--- a/internal/projects/apiKeys/api_keys.go
+++ b/internal/projects/apiKeys/api_keys.go
@@ -3,6 +3,7 @@ package apiKeys
 import (
 	"context"
 	"fmt"
+	"os"
 	"strings"
 
 	"github.com/go-errors/errors"
@@ -18,14 +19,18 @@ func Run(ctx context.Context, projectRef string, fsys afero.Fs) error {
 		return err
 	}
 
-	table := `|NAME|KEY VALUE|
+	if utils.OutputFormat.Value == utils.OutputPretty {
+		table := `|NAME|KEY VALUE|
 |-|-|
 `
-	for _, entry := range keys {
-		table += fmt.Sprintf("|`%s`|`%s`|\n", strings.ReplaceAll(entry.Name, "|", "\\|"), entry.ApiKey)
+		for _, entry := range keys {
+			table += fmt.Sprintf("|`%s`|`%s`|\n", strings.ReplaceAll(entry.Name, "|", "\\|"), entry.ApiKey)
+		}
+
+		return list.RenderTable(table)
 	}
 
-	return list.RenderTable(table)
+	return utils.EncodeOutput(utils.OutputFormat.Value, os.Stdout, keys)
 }
 
 func RunGetApiKeys(ctx context.Context, projectRef string) ([]api.ApiKeyResponse, error) {
diff --git a/internal/projects/create/create.go b/internal/projects/create/create.go
index 1df4b387..01ebf630 100644
--- a/internal/projects/create/create.go
+++ b/internal/projects/create/create.go
@@ -30,13 +30,17 @@ func Run(ctx context.Context, params api.V1CreateProjectBody, fsys afero.Fs) err
 
 	flags.ProjectRef = resp.JSON201.Id
 	viper.Set("DB_PASSWORD", params.DbPass)
-	if err := credentials.Set(flags.ProjectRef, params.DbPass); err != nil {
+	if err := credentials.StoreProvider.Set(flags.ProjectRef, params.DbPass); err != nil {
 		fmt.Fprintln(os.Stderr, "Failed to save database password:", err)
 	}
 
 	projectUrl := fmt.Sprintf("%s/project/%s", utils.GetSupabaseDashboardURL(), resp.JSON201.Id)
-	fmt.Printf("Created a new project %s at %s\n", utils.Aqua(resp.JSON201.Name), utils.Bold(projectUrl))
-	return nil
+	fmt.Fprintf(os.Stderr, "Created a new project %s at %s\n", utils.Aqua(resp.JSON201.Name), utils.Bold(projectUrl))
+	if utils.OutputFormat.Value == utils.OutputPretty {
+		return nil
+	}
+
+	return utils.EncodeOutput(utils.OutputFormat.Value, os.Stdout, resp.JSON201)
 }
 
 func printKeyValue(key, value string) string {
diff --git a/internal/projects/delete/delete.go b/internal/projects/delete/delete.go
index c8ce9d53..f042f62e 100644
--- a/internal/projects/delete/delete.go
+++ b/internal/projects/delete/delete.go
@@ -43,7 +43,7 @@ func Run(ctx context.Context, ref string, fsys afero.Fs) error {
 	}
 
 	// Unlink project
-	if err := credentials.Delete(ref); err != nil && !errors.Is(err, keyring.ErrNotFound) {
+	if err := credentials.StoreProvider.Delete(ref); err != nil && !errors.Is(err, keyring.ErrNotFound) {
 		fmt.Fprintln(os.Stderr, err)
 	}
 	if match, err := afero.FileContainsBytes(fsys, utils.ProjectRefPath, []byte(ref)); match {
diff --git a/internal/projects/list/list.go b/internal/projects/list/list.go
index 18798ec0..b16b6d4f 100644
--- a/internal/projects/list/list.go
+++ b/internal/projects/list/list.go
@@ -5,15 +5,20 @@ import (
 	"fmt"
 	"os"
 	"strings"
-	"time"
 
 	"github.com/go-errors/errors"
 	"github.com/spf13/afero"
 	"github.com/supabase/cli/internal/migration/list"
 	"github.com/supabase/cli/internal/utils"
 	"github.com/supabase/cli/internal/utils/flags"
+	"github.com/supabase/cli/pkg/api"
 )
 
+type linkedProject struct {
+	api.V1ProjectResponse `yaml:",inline"`
+	Linked                bool `json:"linked"`
+}
+
 func Run(ctx context.Context, fsys afero.Fs) error {
 	resp, err := utils.GetSupabase().V1ListAllProjectsWithResponse(ctx)
 	if err != nil {
@@ -29,30 +34,51 @@ func Run(ctx context.Context, fsys afero.Fs) error {
 		fmt.Fprintln(os.Stderr, err)
 	}
 
-	table := `LINKED|ORG ID|REFERENCE ID|NAME|REGION|CREATED AT (UTC)
+	var projects []linkedProject
+	for _, project := range *resp.JSON200 {
+		projects = append(projects, linkedProject{
+			V1ProjectResponse: project,
+			Linked:            project.Id == projectRef,
+		})
+	}
+
+	if utils.OutputFormat.Value == utils.OutputPretty {
+		table := `LINKED|ORG ID|REFERENCE ID|NAME|REGION|CREATED AT (UTC)
 |-|-|-|-|-|-|
 `
-	for _, project := range *resp.JSON200 {
-		if t, err := time.Parse(time.RFC3339, project.CreatedAt); err == nil {
-			project.CreatedAt = t.UTC().Format("2006-01-02 15:04:05")
-		}
-		if region, ok := utils.RegionMap[project.Region]; ok {
-			project.Region = region
+		for _, project := range projects {
+			table += fmt.Sprintf(
+				"|`%s`|`%s`|`%s`|`%s`|`%s`|`%s`|\n",
+				formatBullet(project.Linked),
+				project.OrganizationId,
+				project.Id,
+				strings.ReplaceAll(project.Name, "|", "\\|"),
+				formatRegion(project.Region),
+				utils.FormatTimestamp(project.CreatedAt),
+			)
 		}
-		linked := " "
-		if project.Id == projectRef {
-			linked = "  ●"
-		}
-		table += fmt.Sprintf(
-			"|`%s`|`%s`|`%s`|`%s`|`%s`|`%s`|\n",
-			linked,
-			project.OrganizationId,
-			project.Id,
-			strings.ReplaceAll(project.Name, "|", "\\|"),
-			project.Region,
-			utils.FormatTimestamp(project.CreatedAt),
-		)
+		return list.RenderTable(table)
+	} else if utils.OutputFormat.Value == utils.OutputToml {
+		return utils.EncodeOutput(utils.OutputFormat.Value, os.Stdout, struct {
+			Projects []linkedProject `toml:"projects"`
+		}{
+			Projects: projects,
+		})
 	}
 
-	return list.RenderTable(table)
+	return utils.EncodeOutput(utils.OutputFormat.Value, os.Stdout, projects)
+}
+
+func formatBullet(value bool) string {
+	if value {
+		return "  ●"
+	}
+	return " "
+}
+
+func formatRegion(region string) string {
+	if readable, ok := utils.RegionMap[region]; ok {
+		return readable
+	}
+	return region
 }
diff --git a/internal/start/start.go b/internal/start/start.go
index d1a9612a..2c3017ce 100644
--- a/internal/start/start.go
+++ b/internal/start/start.go
@@ -86,7 +86,7 @@ func Run(ctx context.Context, fsys afero.Fs, excludedContainers []string, ignore
 		if ignoreHealthCheck && start.IsUnhealthyError(err) {
 			fmt.Fprintln(os.Stderr, err)
 		} else {
-			if err := utils.DockerRemoveAll(context.Background(), os.Stderr); err != nil {
+			if err := utils.DockerRemoveAll(context.Background(), os.Stderr, utils.Config.ProjectId); err != nil {
 				fmt.Fprintln(os.Stderr, err)
 			}
 			return err
@@ -189,6 +189,7 @@ func run(p utils.Program, ctx context.Context, fsys afero.Fs, excludedContainers
 	}
 
 	var started []string
+	var isStorageEnabled = utils.Config.Storage.Enabled && !isContainerExcluded(utils.Config.Storage.Image, excluded)
 	p.Send(utils.StatusMsg("Starting containers..."))
 
 	// Start Logflare
@@ -759,7 +760,7 @@ EOF
 					"SECRET_KEY_BASE=" + utils.Config.Realtime.SecretKeyBase,
 					"ERL_AFLAGS=" + utils.ToRealtimeEnv(utils.Config.Realtime.IpVersion),
 					"DNS_NODES=''",
-					"RLIMIT_NOFILE=10000",
+					"RLIMIT_NOFILE=",
 					"SEED_SELF_HOST=true",
 					fmt.Sprintf("MAX_HEADER_LENGTH=%d", utils.Config.Realtime.MaxHeaderLength),
 				},
@@ -827,7 +828,7 @@ EOF
 	}
 
 	// Start Storage.
-	if utils.Config.Storage.Enabled && !isContainerExcluded(utils.Config.Storage.Image, excluded) {
+	if isStorageEnabled {
 		dockerStoragePath := "/mnt"
 		if _, err := utils.DockerStart(
 			ctx,
@@ -885,7 +886,7 @@ EOF
 	}
 
 	// Start Storage ImgProxy.
-	if utils.Config.Storage.Enabled && utils.Config.Storage.ImageTransformation.Enabled && !isContainerExcluded(utils.Config.Storage.ImageTransformation.Image, excluded) {
+	if isStorageEnabled && utils.Config.Storage.ImageTransformation.Enabled && !isContainerExcluded(utils.Config.Storage.ImageTransformation.Image, excluded) {
 		if _, err := utils.DockerStart(
 			ctx,
 			container.Config{
@@ -944,7 +945,7 @@ EOF
 					"PG_META_DB_PASSWORD=" + dbConfig.Password,
 				},
 				Healthcheck: &container.HealthConfig{
-					Test:     []string{"CMD", "node", `--eval='fetch("http://127.0.0.1:8080/health").then((r) => {if (r.status !== 200) throw new Error(r.status)})'`},
+					Test:     []string{"CMD-SHELL", `node --eval="fetch('http://127.0.0.1:8080/health').then((r) => {if (!r.ok) throw new Error(r.status)})"`},
 					Interval: 10 * time.Second,
 					Timeout:  2 * time.Second,
 					Retries:  3,
@@ -990,7 +991,7 @@ EOF
 					"HOSTNAME=0.0.0.0",
 				},
 				Healthcheck: &container.HealthConfig{
-					Test:     []string{"CMD", "node", `--eval='fetch("http://127.0.0.1:3000/api/profile", (r) => {if (r.statusCode !== 200) throw new Error(r.statusCode)})'`},
+					Test:     []string{"CMD-SHELL", `node --eval="fetch('http://127.0.0.1:3000/api/profile').then((r) => {if (!r.ok) throw new Error(r.status)})"`},
 					Interval: 10 * time.Second,
 					Timeout:  2 * time.Second,
 					Retries:  3,
diff --git a/internal/start/templates/kong.yml b/internal/start/templates/kong.yml
index 3865eba1..8f1d28fd 100644
--- a/internal/start/templates/kong.yml
+++ b/internal/start/templates/kong.yml
@@ -76,7 +76,7 @@ services:
             headers:
               - "Content-Profile: graphql_public"
   - name: realtime-v1-ws
-    _comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*"
+    _comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/websocket"
     url: http://{{ .RealtimeId }}:4000/socket
     protocol: ws
     routes:
@@ -86,6 +86,17 @@ services:
           - /realtime/v1/
     plugins:
       - name: cors
+  - name: realtime-v1-longpoll
+    _comment: "Realtime: /realtime/v1/* -> ws://realtime:4000/socket/longpoll"
+    url: http://{{ .RealtimeId }}:4000/socket
+    protocol: http
+    routes:
+      - name: realtime-v1-longpoll
+        strip_path: true
+        paths:
+          - /realtime/v1/
+    plugins:
+      - name: cors
   - name: realtime-v1-rest
     _comment: "Realtime: /realtime/v1/* -> http://realtime:4000/api/*"
     url: http://{{ .RealtimeId }}:4000/api
diff --git a/internal/status/status.go b/internal/status/status.go
index 0963be09..e78af5cd 100644
--- a/internal/status/status.go
+++ b/internal/status/status.go
@@ -89,7 +89,7 @@ func Run(ctx context.Context, names CustomName, format string, fsys afero.Fs) er
 
 func checkServiceHealth(ctx context.Context) ([]string, error) {
 	resp, err := utils.Docker.ContainerList(ctx, container.ListOptions{
-		Filters: utils.CliProjectFilter(),
+		Filters: utils.CliProjectFilter(utils.Config.ProjectId),
 	})
 	if err != nil {
 		return nil, errors.Errorf("failed to list running containers: %w", err)
diff --git a/internal/stop/stop.go b/internal/stop/stop.go
index b4bd94c2..39c5e00e 100644
--- a/internal/stop/stop.go
+++ b/internal/stop/stop.go
@@ -11,33 +11,42 @@ import (
 	"github.com/supabase/cli/internal/utils"
 )
 
-func Run(ctx context.Context, backup bool, projectId string, fsys afero.Fs) error {
-	// Sanity checks.
-	if len(projectId) > 0 {
-		utils.Config.ProjectId = projectId
-	} else if err := utils.LoadConfigFS(fsys); err != nil {
-		return err
+func Run(ctx context.Context, backup bool, projectId string, all bool, fsys afero.Fs) error {
+	var searchProjectIdFilter string
+	if !all {
+		// Sanity checks.
+		if len(projectId) > 0 {
+			utils.Config.ProjectId = projectId
+		} else if err := utils.LoadConfigFS(fsys); err != nil {
+			return err
+		}
+		searchProjectIdFilter = utils.Config.ProjectId
 	}
 
 	// Stop all services
 	if err := utils.RunProgram(ctx, func(p utils.Program, ctx context.Context) error {
 		w := utils.StatusWriter{Program: p}
-		return stop(ctx, backup, w)
+		return stop(ctx, backup, w, searchProjectIdFilter)
 	}); err != nil {
 		return err
 	}
 
 	fmt.Println("Stopped " + utils.Aqua("supabase") + " local development setup.")
 	if resp, err := utils.Docker.VolumeList(ctx, volume.ListOptions{
-		Filters: utils.CliProjectFilter(),
+		Filters: utils.CliProjectFilter(searchProjectIdFilter),
 	}); err == nil && len(resp.Volumes) > 0 {
-		listVolume := fmt.Sprintf("docker volume ls --filter label=%s=%s", utils.CliProjectLabel, utils.Config.ProjectId)
-		utils.CmdSuggestion = "Local data are backed up to docker volume. Use docker to show them: " + utils.Aqua(listVolume)
+		if len(searchProjectIdFilter) > 0 {
+			listVolume := fmt.Sprintf("docker volume ls --filter label=%s=%s", utils.CliProjectLabel, searchProjectIdFilter)
+			utils.CmdSuggestion = "Local data are backed up to docker volume. Use docker to show them: " + utils.Aqua(listVolume)
+		} else {
+			listVolume := fmt.Sprintf("docker volume ls --filter label=%s", utils.CliProjectLabel)
+			utils.CmdSuggestion = "Local data are backed up to docker volume. Use docker to show them: " + utils.Aqua(listVolume)
+		}
 	}
 	return nil
 }
 
-func stop(ctx context.Context, backup bool, w io.Writer) error {
+func stop(ctx context.Context, backup bool, w io.Writer, projectId string) error {
 	utils.NoBackupVolume = !backup
-	return utils.DockerRemoveAll(ctx, w)
+	return utils.DockerRemoveAll(ctx, w, projectId)
 }
diff --git a/internal/unlink/unlink.go b/internal/unlink/unlink.go
index aa0f7687..c6297581 100644
--- a/internal/unlink/unlink.go
+++ b/internal/unlink/unlink.go
@@ -34,7 +34,7 @@ func Unlink(projectRef string, fsys afero.Fs) error {
 		allErrors = append(allErrors, wrapped)
 	}
 	// Remove linked credentials
-	if err := credentials.Delete(projectRef); err != nil &&
+	if err := credentials.StoreProvider.Delete(projectRef); err != nil &&
 		!errors.Is(err, credentials.ErrNotSupported) &&
 		!errors.Is(err, keyring.ErrNotFound) {
 		allErrors = append(allErrors, err)
diff --git a/internal/utils/access_token.go b/internal/utils/access_token.go
index c94b9de8..f7ef90a0 100644
--- a/internal/utils/access_token.go
+++ b/internal/utils/access_token.go
@@ -41,7 +41,7 @@ func loadAccessToken(fsys afero.Fs) (string, error) {
 		return accessToken, nil
 	}
 	// Load from native credentials store
-	if accessToken, err := credentials.Get(AccessTokenKey); err == nil {
+	if accessToken, err := credentials.StoreProvider.Get(AccessTokenKey); err == nil {
 		return accessToken, nil
 	}
 	// Fallback to token file
@@ -68,7 +68,7 @@ func SaveAccessToken(accessToken string, fsys afero.Fs) error {
 		return errors.New(ErrInvalidToken)
 	}
 	// Save to native credentials store
-	if err := credentials.Set(AccessTokenKey, accessToken); err == nil {
+	if err := credentials.StoreProvider.Set(AccessTokenKey, accessToken); err == nil {
 		return nil
 	}
 	// Fallback to token file
@@ -94,13 +94,13 @@ func DeleteAccessToken(fsys afero.Fs) error {
 	if err := fallbackDeleteToken(fsys); err == nil {
 		// Typically user system should only have either token file or keyring.
 		// But we delete from both just in case.
-		_ = credentials.Delete(AccessTokenKey)
+		_ = credentials.StoreProvider.Delete(AccessTokenKey)
 		return nil
 	} else if !errors.Is(err, os.ErrNotExist) {
 		return err
 	}
 	// Fallback not found, delete from native credentials store
-	err := credentials.Delete(AccessTokenKey)
+	err := credentials.StoreProvider.Delete(AccessTokenKey)
 	if errors.Is(err, credentials.ErrNotSupported) || errors.Is(err, keyring.ErrNotFound) {
 		return errors.New(ErrNotLoggedIn)
 	} else if err != nil {
diff --git a/internal/utils/credentials/keyring_darwin.go b/internal/utils/credentials/keyring_darwin.go
new file mode 100644
index 00000000..cca5d72f
--- /dev/null
+++ b/internal/utils/credentials/keyring_darwin.go
@@ -0,0 +1,34 @@
+//go:build darwin
+
+package credentials
+
+import (
+	"os/exec"
+
+	"github.com/go-errors/errors"
+)
+
+const execPathKeychain = "/usr/bin/security"
+
+func deleteAll(service string) error {
+	if len(service) == 0 {
+		return errors.New("missing service name")
+	}
+	// Delete each secret in a while loop until there is no more left
+	for {
+		if err := exec.Command(
+			execPathKeychain,
+			"delete-generic-password",
+			"-s", service,
+		).Run(); err == nil {
+			continue
+		} else if errors.Is(err, exec.ErrNotFound) {
+			return errors.New(ErrNotSupported)
+		} else if exitError, ok := err.(*exec.ExitError); ok && exitError.ExitCode() == 44 {
+			// Exit 44 means no item exists for this service name
+			return nil
+		} else {
+			return errors.Errorf("failed to delete all credentials: %w", err)
+		}
+	}
+}
diff --git a/internal/utils/credentials/keyring_linux.go b/internal/utils/credentials/keyring_linux.go
new file mode 100644
index 00000000..08095cfb
--- /dev/null
+++ b/internal/utils/credentials/keyring_linux.go
@@ -0,0 +1,33 @@
+//go:build linux
+
+package credentials
+
+import (
+	"github.com/go-errors/errors"
+	ss "github.com/zalando/go-keyring/secret_service"
+)
+
+func deleteAll(service string) error {
+	svc, err := ss.NewSecretService()
+	if err != nil {
+		return errors.Errorf("failed to create secret service: %w", err)
+	}
+
+	collection := svc.GetLoginCollection()
+	if err := svc.Unlock(collection.Path()); err != nil {
+		return errors.Errorf("failed to unlock collection: %w", err)
+	}
+
+	search := map[string]string{"service": service}
+	results, err := svc.SearchItems(collection, search)
+	if err != nil {
+		return errors.Errorf("failed to search items: %w", err)
+	}
+
+	for _, item := range results {
+		if err := svc.Delete(item); err != nil {
+			return errors.Errorf("failed to delete all credentials: %w", err)
+		}
+	}
+	return nil
+}
diff --git a/internal/utils/credentials/keyring_windows.go b/internal/utils/credentials/keyring_windows.go
new file mode 100644
index 00000000..0366a686
--- /dev/null
+++ b/internal/utils/credentials/keyring_windows.go
@@ -0,0 +1,25 @@
+//go:build windows
+
+package credentials
+
+import (
+	"github.com/danieljoos/wincred"
+	"github.com/go-errors/errors"
+)
+
+func deleteAll(service string) error {
+	if err := assertKeyringSupported(); err != nil {
+		return err
+	}
+	creds, err := wincred.FilteredList(service + ":")
+	if err != nil {
+		return errors.Errorf("failed to list credentials: %w", err)
+	}
+	for _, c := range creds {
+		gc := wincred.GenericCredential{Credential: *c}
+		if err := gc.Delete(); err != nil {
+			return errors.Errorf("failed to delete all credentials: %w", err)
+		}
+	}
+	return nil
+}
diff --git a/internal/utils/credentials/store.go b/internal/utils/credentials/store.go
index 32a2abd2..02f97e20 100644
--- a/internal/utils/credentials/store.go
+++ b/internal/utils/credentials/store.go
@@ -13,8 +13,19 @@ const namespace = "Supabase CLI"
 
 var ErrNotSupported = errors.New("Keyring is not supported on WSL")
 
-// Retrieves the stored password of a project and username
-func Get(project string) (string, error) {
+type Store interface {
+	Get(key string) (string, error)
+	Set(key, value string) error
+	Delete(project string) error
+	DeleteAll() error
+}
+
+type KeyringStore struct{}
+
+var StoreProvider Store = &KeyringStore{}
+
+// Get retrieves the password for a project from the keyring.
+func (ks *KeyringStore) Get(project string) (string, error) {
 	if err := assertKeyringSupported(); err != nil {
 		return "", err
 	}
@@ -27,32 +38,36 @@ func Get(project string) (string, error) {
 	return val, nil
 }
 
-// Stores the password of a project and username
-func Set(project, password string) error {
+func (ks *KeyringStore) Set(project, password string) error {
 	if err := assertKeyringSupported(); err != nil {
 		return err
 	}
-	if err := keyring.Set(namespace, project, password); errors.Is(err, exec.ErrNotFound) {
-		return errors.New(ErrNotSupported)
-	} else if err != nil {
+	if err := keyring.Set(namespace, project, password); err != nil {
+		if errors.Is(err, exec.ErrNotFound) {
+			return ErrNotSupported
+		}
 		return errors.Errorf("failed to set credentials: %w", err)
 	}
 	return nil
 }
 
-// Erases the stored password of a project and username
-func Delete(project string) error {
+func (ks *KeyringStore) Delete(project string) error {
 	if err := assertKeyringSupported(); err != nil {
 		return err
 	}
-	if err := keyring.Delete(namespace, project); errors.Is(err, exec.ErrNotFound) {
-		return errors.New(ErrNotSupported)
-	} else if err != nil {
+	if err := keyring.Delete(namespace, project); err != nil {
+		if errors.Is(err, exec.ErrNotFound) {
+			return ErrNotSupported
+		}
 		return errors.Errorf("failed to delete credentials: %w", err)
 	}
 	return nil
 }
 
+func (ks *KeyringStore) DeleteAll() error {
+	return deleteAll(namespace)
+}
+
 func assertKeyringSupported() error {
 	// Suggested check: https://github.com/microsoft/WSL/issues/423
 	if f, err := os.ReadFile("/proc/sys/kernel/osrelease"); err == nil {
diff --git a/internal/utils/credentials/store_mock.go b/internal/utils/credentials/store_mock.go
new file mode 100644
index 00000000..32715fc3
--- /dev/null
+++ b/internal/utils/credentials/store_mock.go
@@ -0,0 +1,68 @@
+package credentials
+
+import (
+	"github.com/zalando/go-keyring"
+)
+
+type mockProvider struct {
+	mockStore map[string]map[string]string
+	mockError error
+}
+
+// Get retrieves the password for a project from the mock store.
+func (m *mockProvider) Get(project string) (string, error) {
+	if m.mockError != nil {
+		return "", m.mockError
+	}
+	if pass, ok := m.mockStore[namespace][project]; ok {
+		return pass, nil
+	}
+	return "", keyring.ErrNotFound
+}
+
+// Set stores the password for a project in the mock store.
+func (m *mockProvider) Set(project, password string) error {
+	if m.mockError != nil {
+		return m.mockError
+	}
+	if m.mockStore == nil {
+		m.mockStore = make(map[string]map[string]string)
+	}
+	if m.mockStore[namespace] == nil {
+		m.mockStore[namespace] = make(map[string]string)
+	}
+	m.mockStore[namespace][project] = password
+	return nil
+}
+
+// Delete removes the password for a project from the mock store.
+func (m *mockProvider) Delete(project string) error {
+	if m.mockError != nil {
+		return m.mockError
+	}
+	if _, ok := m.mockStore[namespace][project]; ok {
+		delete(m.mockStore[namespace], project)
+		return nil
+	}
+	return keyring.ErrNotFound
+}
+
+// DeleteAll removes all passwords from the mock store.
+func (m *mockProvider) DeleteAll() error {
+	if m.mockError != nil {
+		return m.mockError
+	}
+	delete(m.mockStore, namespace)
+	return nil
+}
+
+func MockInit() func() {
+	oldStore := StoreProvider
+	teardown := func() {
+		StoreProvider = oldStore
+	}
+	StoreProvider = &mockProvider{
+		mockStore: map[string]map[string]string{},
+	}
+	return teardown
+}
diff --git a/internal/utils/docker.go b/internal/utils/docker.go
index 8a44c75d..80106583 100644
--- a/internal/utils/docker.go
+++ b/internal/utils/docker.go
@@ -20,7 +20,6 @@ import (
 	dockerConfig "github.com/docker/cli/cli/config"
 	dockerFlags "github.com/docker/cli/cli/flags"
 	"github.com/docker/cli/cli/streams"
-	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/filters"
 	"github.com/docker/docker/api/types/image"
@@ -65,10 +64,7 @@ func DockerNetworkCreateIfNotExists(ctx context.Context, mode container.NetworkM
 	if !isUserDefined(mode) {
 		return nil
 	}
-	_, err := Docker.NetworkCreate(ctx, mode.NetworkName(), types.NetworkCreate{
-		CheckDuplicate: true,
-		Labels:         labels,
-	})
+	_, err := Docker.NetworkCreate(ctx, mode.NetworkName(), network.CreateOptions{Labels: labels})
 	// if error is network already exists, no need to propagate to user
 	if errdefs.IsConflict(err) || errors.Is(err, podman.ErrNetworkExists) {
 		return nil
@@ -96,9 +92,9 @@ func WaitAll[T any](containers []T, exec func(container T) error) []error {
 // NoBackupVolume TODO: encapsulate this state in a class
 var NoBackupVolume = false
 
-func DockerRemoveAll(ctx context.Context, w io.Writer) error {
+func DockerRemoveAll(ctx context.Context, w io.Writer, projectId string) error {
 	fmt.Fprintln(w, "Stopping containers...")
-	args := CliProjectFilter()
+	args := CliProjectFilter(projectId)
 	containers, err := Docker.ContainerList(ctx, container.ListOptions{
 		All:     true,
 		Filters: args,
@@ -148,9 +144,14 @@ func DockerRemoveAll(ctx context.Context, w io.Writer) error {
 	return nil
 }
 
-func CliProjectFilter() filters.Args {
+func CliProjectFilter(projectId string) filters.Args {
+	if len(projectId) == 0 {
+		return filters.NewArgs(
+			filters.Arg("label", CliProjectLabel),
+		)
+	}
 	return filters.NewArgs(
-		filters.Arg("label", CliProjectLabel+"="+Config.ProjectId),
+		filters.Arg("label", CliProjectLabel+"="+projectId),
 	)
 }
 
@@ -410,19 +411,19 @@ func DockerStreamLogsOnce(ctx context.Context, containerId string, stdout, stder
 }
 
 // Exec a command once inside a container, returning stdout and throwing error on non-zero exit code.
-func DockerExecOnce(ctx context.Context, container string, env []string, cmd []string) (string, error) {
+func DockerExecOnce(ctx context.Context, containerId string, env []string, cmd []string) (string, error) {
 	stderr := io.Discard
 	if viper.GetBool("DEBUG") {
 		stderr = os.Stderr
 	}
 	var out bytes.Buffer
-	err := DockerExecOnceWithStream(ctx, container, "", env, cmd, &out, stderr)
+	err := DockerExecOnceWithStream(ctx, containerId, "", env, cmd, &out, stderr)
 	return out.String(), err
 }
 
-func DockerExecOnceWithStream(ctx context.Context, container, workdir string, env, cmd []string, stdout, stderr io.Writer) error {
+func DockerExecOnceWithStream(ctx context.Context, containerId, workdir string, env, cmd []string, stdout, stderr io.Writer) error {
 	// Reset shadow database
-	exec, err := Docker.ContainerExecCreate(ctx, container, types.ExecConfig{
+	exec, err := Docker.ContainerExecCreate(ctx, containerId, container.ExecOptions{
 		Env:          env,
 		Cmd:          cmd,
 		WorkingDir:   workdir,
@@ -433,7 +434,7 @@ func DockerExecOnceWithStream(ctx context.Context, container, workdir string, en
 		return errors.Errorf("failed to exec docker create: %w", err)
 	}
 	// Read exec output
-	resp, err := Docker.ContainerExecAttach(ctx, exec.ID, types.ExecStartCheck{})
+	resp, err := Docker.ContainerExecAttach(ctx, exec.ID, container.ExecStartOptions{})
 	if err != nil {
 		return errors.Errorf("failed to exec docker attach: %w", err)
 	}
diff --git a/internal/utils/flags/db_url.go b/internal/utils/flags/db_url.go
index c183aa1a..6fc91217 100644
--- a/internal/utils/flags/db_url.go
+++ b/internal/utils/flags/db_url.go
@@ -104,7 +104,7 @@ func getPassword(projectRef string) string {
 	if password := viper.GetString("DB_PASSWORD"); len(password) > 0 {
 		return password
 	}
-	if password, err := credentials.Get(projectRef); err == nil {
+	if password, err := credentials.StoreProvider.Get(projectRef); err == nil {
 		return password
 	}
 	resetUrl := fmt.Sprintf("%s/project/%s/settings/database", utils.GetSupabaseDashboardURL(), projectRef)
diff --git a/internal/utils/output.go b/internal/utils/output.go
index 4b916c37..6d1a72aa 100644
--- a/internal/utils/output.go
+++ b/internal/utils/output.go
@@ -29,6 +29,11 @@ var (
 		OutputToml,
 		OutputYaml,
 	}
+
+	OutputFormat = EnumFlag{
+		Allowed: OutputDefaultAllowed,
+		Value:   OutputPretty,
+	}
 )
 
 func EncodeOutput(format string, w io.Writer, value any) error {
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 3d3be2f2..db441e9b 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -160,6 +160,11 @@ type (
 		Password     string `toml:"-"`
 		RootKey      string `toml:"-" mapstructure:"root_key"`
 		Pooler       pooler `toml:"pooler"`
+		Seed         seed   `toml:"seed"`
+	}
+
+	seed struct {
+		Enabled bool `toml:"enabled"`
 	}
 
 	pooler struct {
@@ -404,6 +409,7 @@ type (
 	FunctionConfig map[string]function
 
 	function struct {
+		Enabled    *bool  `toml:"enabled"`
 		VerifyJWT  *bool  `toml:"verify_jwt" json:"verifyJWT"`
 		ImportMap  string `toml:"import_map" json:"importMapPath,omitempty"`
 		Entrypoint string `json:"-"`
@@ -457,6 +463,9 @@ func NewConfig(editors ...ConfigEditor) config {
 				EncryptionKey: "12345678901234567890123456789032",
 				SecretKeyBase: "EAx3IQ/wRG1v47ZD4NE4/9RzBI8Jmil3x0yhcW4V2NHBP6c2iPIzwjofi2Ep4HIG",
 			},
+			Seed: seed{
+				Enabled: true,
+			},
 		},
 		Realtime: realtime{
 			Image:           realtimeImage,
@@ -1072,10 +1081,17 @@ func (c *tpaCognito) validate() error {
 	if c.UserPoolID == "" {
 		return errors.New("Invalid config: auth.third_party.cognito is enabled but without a user_pool_id.")
 	}
+	var err error
+	if c.UserPoolID, err = maybeLoadEnv(c.UserPoolID); err != nil {
+		return err
+	}
 
 	if c.UserPoolRegion == "" {
 		return errors.New("Invalid config: auth.third_party.cognito is enabled but without a user_pool_region.")
 	}
+	if c.UserPoolRegion, err = maybeLoadEnv(c.UserPoolRegion); err != nil {
+		return err
+	}
 
 	return nil
 }
diff --git a/pkg/config/constants.go b/pkg/config/constants.go
index f81e21a4..93331225 100644
--- a/pkg/config/constants.go
+++ b/pkg/config/constants.go
@@ -12,7 +12,7 @@ const (
 	pgmetaImage      = "supabase/postgres-meta:v0.83.2"
 	studioImage      = "supabase/studio:20240729-ce42139"
 	imageProxyImage  = "darthsim/imgproxy:v3.8.0"
-	edgeRuntimeImage = "supabase/edge-runtime:v1.58.2"
+	edgeRuntimeImage = "supabase/edge-runtime:v1.58.3"
 	vectorImage      = "timberio/vector:0.28.1-alpine"
 	supavisorImage   = "supabase/supavisor:1.1.56"
 	gotrueImage      = "supabase/gotrue:v2.158.1"
diff --git a/pkg/migration/seed.go b/pkg/migration/seed.go
index 79b2dbc2..f299e9f0 100644
--- a/pkg/migration/seed.go
+++ b/pkg/migration/seed.go
@@ -28,9 +28,13 @@ func SeedGlobals(ctx context.Context, pending []string, conn *pgx.Conn, fsys fs.
 	for _, path := range pending {
 		filename := filepath.Base(path)
 		fmt.Fprintf(os.Stderr, "Seeding globals from %s...\n", filename)
-		if globals, err := NewMigrationFromFile(path, fsys); err != nil {
+		globals, err := NewMigrationFromFile(path, fsys)
+		if err != nil {
 			return err
-		} else if err := globals.ExecBatch(ctx, conn); err != nil {
+		}
+		// Skip inserting to migration history
+		globals.Version = ""
+		if err := globals.ExecBatch(ctx, conn); err != nil {
 			return err
 		}
 	}


Test patch:
diff --git a/internal/db/lint/lint_test.go b/internal/db/lint/lint_test.go
index 40ce0503..8d7abef8 100644
--- a/internal/db/lint/lint_test.go
+++ b/internal/db/lint/lint_test.go
@@ -65,7 +65,7 @@ func TestLintCommand(t *testing.T) {
 		Reply("SELECT 1", []interface{}{"f1", string(data)}).
 		Query("rollback").Reply("ROLLBACK")
 	// Run test
-	err = Run(context.Background(), []string{"public"}, "warning", dbConfig, fsys, conn.Intercept)
+	err = Run(context.Background(), []string{"public"}, "warning", "none", dbConfig, fsys, conn.Intercept)
 	// Check error
 	assert.NoError(t, err)
 	assert.Empty(t, apitest.ListUnmatchedRequests())
@@ -221,7 +221,8 @@ func TestPrintResult(t *testing.T) {
 	t.Run("filters warning level", func(t *testing.T) {
 		// Run test
 		var out bytes.Buffer
-		assert.NoError(t, printResultJSON(result, toEnum("warning"), &out))
+		filtered := filterResult(result, toEnum("warning"))
+		assert.NoError(t, printResultJSON(filtered, &out))
 		// Validate output
 		var actual []Result
 		assert.NoError(t, json.Unmarshal(out.Bytes(), &actual))
@@ -231,7 +232,8 @@ func TestPrintResult(t *testing.T) {
 	t.Run("filters error level", func(t *testing.T) {
 		// Run test
 		var out bytes.Buffer
-		assert.NoError(t, printResultJSON(result, toEnum("error"), &out))
+		filtered := filterResult(result, toEnum("error"))
+		assert.NoError(t, printResultJSON(filtered, &out))
 		// Validate output
 		var actual []Result
 		assert.NoError(t, json.Unmarshal(out.Bytes(), &actual))
@@ -240,4 +242,58 @@ func TestPrintResult(t *testing.T) {
 			Issues:   []Issue{result[0].Issues[1]},
 		}}, actual)
 	})
+
+	t.Run("exits with non-zero status on warning", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		// Setup mock postgres
+		conn := pgtest.NewConn()
+		defer conn.Close(t)
+		conn.Query("begin").Reply("BEGIN").
+			Query(ENABLE_PGSQL_CHECK).
+			Reply("CREATE EXTENSION").
+			Query(checkSchemaScript, "public").
+			Reply("SELECT 1", []interface{}{"f1", `{"function":"22751","issues":[{"level":"warning","message":"test warning"}]}`}).
+			Query("rollback").Reply("ROLLBACK")
+		// Run test
+		err := Run(context.Background(), []string{"public"}, "warning", "warning", dbConfig, fsys, conn.Intercept)
+		// Check error
+		assert.ErrorContains(t, err, "fail-on is set to warning, non-zero exit")
+	})
+
+	t.Run("exits with non-zero status on error", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		// Setup mock postgres
+		conn := pgtest.NewConn()
+		defer conn.Close(t)
+		conn.Query("begin").Reply("BEGIN").
+			Query(ENABLE_PGSQL_CHECK).
+			Reply("CREATE EXTENSION").
+			Query(checkSchemaScript, "public").
+			Reply("SELECT 1", []interface{}{"f1", `{"function":"22751","issues":[{"level":"error","message":"test error"}]}`}).
+			Query("rollback").Reply("ROLLBACK")
+		// Run test
+		err := Run(context.Background(), []string{"public"}, "warning", "error", dbConfig, fsys, conn.Intercept)
+		// Check error
+		assert.ErrorContains(t, err, "fail-on is set to error, non-zero exit")
+	})
+
+	t.Run("does not exit with non-zero status when fail-on is none", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		// Setup mock postgres
+		conn := pgtest.NewConn()
+		defer conn.Close(t)
+		conn.Query("begin").Reply("BEGIN").
+			Query(ENABLE_PGSQL_CHECK).
+			Reply("CREATE EXTENSION").
+			Query(checkSchemaScript, "public").
+			Reply("SELECT 1", []interface{}{"f1", `{"function":"22751","issues":[{"level":"error","message":"test error"}]}`}).
+			Query("rollback").Reply("ROLLBACK")
+		// Run test
+		err := Run(context.Background(), []string{"public"}, "warning", "none", dbConfig, fsys, conn.Intercept)
+		// Check error
+		assert.NoError(t, err)
+	})
 }
diff --git a/internal/db/reset/reset_test.go b/internal/db/reset/reset_test.go
index 38fef4b9..03da968c 100644
--- a/internal/db/reset/reset_test.go
+++ b/internal/db/reset/reset_test.go
@@ -357,6 +357,33 @@ func TestResetRemote(t *testing.T) {
 		assert.NoError(t, err)
 	})
 
+	t.Run("resets remote database with seed config disabled", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		path := filepath.Join(utils.MigrationsDir, "0_schema.sql")
+		require.NoError(t, afero.WriteFile(fsys, path, nil, 0644))
+		seedPath := filepath.Join(utils.SeedDataPath)
+		// Will raise an error when seeding
+		require.NoError(t, afero.WriteFile(fsys, seedPath, []byte("INSERT INTO test_table;"), 0644))
+		// Setup mock postgres
+		conn := pgtest.NewConn()
+		defer conn.Close(t)
+		conn.Query(migration.ListSchemas, escapedSchemas).
+			Reply("SELECT 1", []interface{}{"private"}).
+			Query("DROP SCHEMA IF EXISTS private CASCADE").
+			Reply("DROP SCHEMA").
+			Query(migration.DropObjects).
+			Reply("INSERT 0")
+		helper.MockMigrationHistory(conn).
+			Query(migration.INSERT_MIGRATION_VERSION, "0", "schema", nil).
+			Reply("INSERT 0 1")
+		utils.Config.Db.Seed.Enabled = false
+		// Run test
+		err := resetRemote(context.Background(), "", dbConfig, fsys, conn.Intercept)
+		// No error should be raised since we're skipping the seed
+		assert.NoError(t, err)
+	})
+
 	t.Run("throws error on connect failure", func(t *testing.T) {
 		// Setup in-memory fs
 		fsys := afero.NewMemMapFs()
diff --git a/internal/db/test/test.go b/internal/db/test/test.go
index 03aa3a54..26330573 100644
--- a/internal/db/test/test.go
+++ b/internal/db/test/test.go
@@ -67,7 +67,8 @@ func Run(ctx context.Context, testFiles []string, config pgconn.Config, fsys afe
 		}()
 	}
 	// Use custom network when connecting to local database
-	hostConfig := container.HostConfig{Binds: binds}
+	// disable selinux via security-opt to allow pg-tap to work properly
+	hostConfig := container.HostConfig{Binds: binds, SecurityOpt: []string{"label:disable"}}
 	if utils.IsLocalDatabase(config) {
 		config.Host = utils.DbAliases[0]
 		config.Port = 5432
diff --git a/internal/functions/deploy/deploy_test.go b/internal/functions/deploy/deploy_test.go
index faea4a71..adf49e63 100644
--- a/internal/functions/deploy/deploy_test.go
+++ b/internal/functions/deploy/deploy_test.go
@@ -121,6 +121,58 @@ import_map = "./import_map.json"
 		assert.Empty(t, apitest.ListUnmatchedRequests())
 	})
 
+	t.Run("skip disabled functions from config", func(t *testing.T) {
+		t.Cleanup(func() { clear(utils.Config.Functions) })
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		require.NoError(t, utils.WriteConfig(fsys, false))
+		f, err := fsys.OpenFile(utils.ConfigPath, os.O_APPEND|os.O_WRONLY, 0600)
+		require.NoError(t, err)
+		_, err = f.WriteString(`
+[functions.disabled-func]
+enabled = false
+import_map = "./import_map.json"
+`)
+		require.NoError(t, err)
+		require.NoError(t, f.Close())
+		importMapPath, err := filepath.Abs(filepath.Join(utils.SupabaseDirPath, "import_map.json"))
+		require.NoError(t, err)
+		require.NoError(t, afero.WriteFile(fsys, importMapPath, []byte("{}"), 0644))
+		// Setup function entrypoints
+		require.NoError(t, afero.WriteFile(fsys, filepath.Join(utils.FunctionsDir, "enabled-func", "index.ts"), []byte{}, 0644))
+		require.NoError(t, afero.WriteFile(fsys, filepath.Join(utils.FunctionsDir, "disabled-func", "index.ts"), []byte{}, 0644))
+		// Setup valid project ref
+		project := apitest.RandomProjectRef()
+		// Setup valid access token
+		token := apitest.RandomAccessToken(t)
+		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
+		// Setup valid deno path
+		_, err = fsys.Create(utils.DenoPathOverride)
+		require.NoError(t, err)
+		// Setup mock api
+		defer gock.OffAll()
+		gock.New(utils.DefaultApiHost).
+			Get("/v1/projects/" + project + "/functions").
+			Reply(http.StatusOK).
+			JSON([]api.FunctionResponse{})
+		gock.New(utils.DefaultApiHost).
+			Post("/v1/projects/"+project+"/functions").
+			MatchParam("slug", "enabled-func").
+			Reply(http.StatusCreated).
+			JSON(api.FunctionResponse{Id: "1"})
+		require.NoError(t, apitest.MockDocker(utils.Docker))
+		apitest.MockDockerStart(utils.Docker, imageUrl, containerId)
+		require.NoError(t, apitest.MockDockerLogs(utils.Docker, containerId, "bundled"))
+		// Setup output file
+		outputDir := filepath.Join(utils.TempDir, ".output_enabled-func")
+		require.NoError(t, afero.WriteFile(fsys, filepath.Join(outputDir, "output.eszip"), []byte(""), 0644))
+		// Run test
+		err = Run(context.Background(), nil, project, nil, "", fsys)
+		// Check error
+		assert.NoError(t, err)
+		assert.Empty(t, apitest.ListUnmatchedRequests())
+	})
+
 	t.Run("throws error on malformed slug", func(t *testing.T) {
 		// Setup in-memory fs
 		fsys := afero.NewMemMapFs()
diff --git a/internal/login/login_test.go b/internal/login/login_test.go
index faf351e9..758fbc5c 100644
--- a/internal/login/login_test.go
+++ b/internal/login/login_test.go
@@ -40,7 +40,7 @@ func TestLoginCommand(t *testing.T) {
 			Token: token,
 			Fsys:  afero.NewMemMapFs(),
 		}))
-		saved, err := credentials.Get(utils.AccessTokenKey)
+		saved, err := credentials.StoreProvider.Get(utils.AccessTokenKey)
 		assert.NoError(t, err)
 		assert.Equal(t, token, saved)
 	})
@@ -83,7 +83,7 @@ func TestLoginCommand(t *testing.T) {
 		expectedBrowserUrl := fmt.Sprintf("%s/cli/login?session_id=%s&token_name=%s&public_key=%s", utils.GetSupabaseDashboardURL(), sessionId, tokenName, publicKey)
 		assert.Contains(t, out.String(), expectedBrowserUrl)
 
-		saved, err := credentials.Get(utils.AccessTokenKey)
+		saved, err := credentials.StoreProvider.Get(utils.AccessTokenKey)
 		assert.NoError(t, err)
 		assert.Equal(t, token, saved)
 		assert.Empty(t, apitest.ListUnmatchedRequests())
diff --git a/internal/logout/logout_test.go b/internal/logout/logout_test.go
index 0bb39be5..42f9f8ea 100644
--- a/internal/logout/logout_test.go
+++ b/internal/logout/logout_test.go
@@ -33,16 +33,37 @@ func TestLogoutCommand(t *testing.T) {
 		assert.Empty(t, saved)
 	})
 
+	t.Run("removes all Supabase CLI credentials", func(t *testing.T) {
+		t.Cleanup(credentials.MockInit())
+		require.NoError(t, credentials.StoreProvider.Set(utils.AccessTokenKey, token))
+		require.NoError(t, credentials.StoreProvider.Set("project1", "password1"))
+		require.NoError(t, credentials.StoreProvider.Set("project2", "password2"))
+		t.Cleanup(fstest.MockStdin(t, "y"))
+		// Run test
+		err := Run(context.Background(), os.Stdout, afero.NewMemMapFs())
+		// Check error
+		assert.NoError(t, err)
+		// Check that access token has been removed
+		saved, _ := credentials.StoreProvider.Get(utils.AccessTokenKey)
+		assert.Empty(t, saved)
+		// check that project 1 has been removed
+		saved, _ = credentials.StoreProvider.Get("project1")
+		assert.Empty(t, saved)
+		// check that project 2 has been removed
+		saved, _ = credentials.StoreProvider.Get("project2")
+		assert.Empty(t, saved)
+	})
+
 	t.Run("skips logout by default", func(t *testing.T) {
 		keyring.MockInit()
-		require.NoError(t, credentials.Set(utils.AccessTokenKey, token))
+		require.NoError(t, credentials.StoreProvider.Set(utils.AccessTokenKey, token))
 		// Setup in-memory fs
 		fsys := afero.NewMemMapFs()
 		// Run test
 		err := Run(context.Background(), os.Stdout, fsys)
 		// Check error
 		assert.ErrorIs(t, err, context.Canceled)
-		saved, err := credentials.Get(utils.AccessTokenKey)
+		saved, err := credentials.StoreProvider.Get(utils.AccessTokenKey)
 		assert.NoError(t, err)
 		assert.Equal(t, token, saved)
 	})
diff --git a/internal/migration/apply/apply_test.go b/internal/migration/apply/apply_test.go
index 7150f626..b8c04174 100644
--- a/internal/migration/apply/apply_test.go
+++ b/internal/migration/apply/apply_test.go
@@ -38,6 +38,30 @@ func TestMigrateDatabase(t *testing.T) {
 		assert.NoError(t, err)
 	})
 
+	t.Run("skip seeding when seed config is disabled", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		path := filepath.Join(utils.MigrationsDir, "0_test.sql")
+		sql := "create schema public"
+		require.NoError(t, afero.WriteFile(fsys, path, []byte(sql), 0644))
+		seedPath := filepath.Join(utils.SeedDataPath)
+		// This will raise an error when seeding
+		require.NoError(t, afero.WriteFile(fsys, seedPath, []byte("INSERT INTO test_table;"), 0644))
+		// Setup mock postgres
+		conn := pgtest.NewConn()
+		defer conn.Close(t)
+		helper.MockMigrationHistory(conn).
+			Query(sql).
+			Reply("CREATE SCHEMA").
+			Query(migration.INSERT_MIGRATION_VERSION, "0", "test", []string{sql}).
+			Reply("INSERT 0 1")
+		utils.Config.Db.Seed.Enabled = false
+		// Run test
+		err := MigrateAndSeed(context.Background(), "", conn.MockClient(t), fsys)
+		// No error should be returned since seeding is skipped
+		assert.NoError(t, err)
+	})
+
 	t.Run("ignores empty local directory", func(t *testing.T) {
 		assert.NoError(t, MigrateAndSeed(context.Background(), "", nil, afero.NewMemMapFs()))
 	})
diff --git a/internal/start/start_test.go b/internal/start/start_test.go
index 645a1cd7..654831cc 100644
--- a/internal/start/start_test.go
+++ b/internal/start/start_test.go
@@ -10,6 +10,7 @@ import (
 	"testing"
 
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/volume"
 	"github.com/h2non/gock"
 	"github.com/jackc/pgconn"
@@ -85,7 +86,7 @@ func TestDatabaseStart(t *testing.T) {
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/networks/create").
 			Reply(http.StatusCreated).
-			JSON(types.NetworkCreateResponse{})
+			JSON(network.CreateResponse{})
 		// Caches all dependencies
 		imageUrl := utils.GetRegistryImageUrl(utils.Config.Db.Image)
 		gock.New(utils.Docker.DaemonHost()).
@@ -201,7 +202,7 @@ func TestDatabaseStart(t *testing.T) {
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/networks/create").
 			Reply(http.StatusCreated).
-			JSON(types.NetworkCreateResponse{})
+			JSON(network.CreateResponse{})
 		// Caches all dependencies
 		imageUrl := utils.GetRegistryImageUrl(utils.Config.Db.Image)
 		gock.New(utils.Docker.DaemonHost()).
diff --git a/internal/stop/stop_test.go b/internal/stop/stop_test.go
index dbb8b903..da571330 100644
--- a/internal/stop/stop_test.go
+++ b/internal/stop/stop_test.go
@@ -3,12 +3,15 @@ package stop
 import (
 	"context"
 	"errors"
+	"fmt"
 	"io"
 	"net/http"
 	"os"
 	"testing"
 
 	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
+	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/volume"
 	"github.com/h2non/gock"
 	"github.com/spf13/afero"
@@ -33,11 +36,11 @@ func TestStopCommand(t *testing.T) {
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/containers/prune").
 			Reply(http.StatusOK).
-			JSON(types.ContainersPruneReport{})
+			JSON(container.PruneReport{})
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/networks/prune").
 			Reply(http.StatusOK).
-			JSON(types.NetworksPruneReport{})
+			JSON(network.PruneReport{})
 		gock.New(utils.Docker.DaemonHost()).
 			Get("/v" + utils.Docker.ClientVersion() + "/volumes").
 			Reply(http.StatusOK).
@@ -45,7 +48,87 @@ func TestStopCommand(t *testing.T) {
 				Name: utils.DbId,
 			}}})
 		// Run test
-		err := Run(context.Background(), true, "", fsys)
+		err := Run(context.Background(), true, "", false, fsys)
+		// Check error
+		assert.NoError(t, err)
+		assert.Empty(t, apitest.ListUnmatchedRequests())
+	})
+
+	t.Run("stops all instances when --all flag is used", func(t *testing.T) {
+		// Setup in-memory fs
+		fsys := afero.NewMemMapFs()
+		require.NoError(t, utils.WriteConfig(fsys, false))
+		// Setup mock docker
+		require.NoError(t, apitest.MockDocker(utils.Docker))
+		defer gock.OffAll()
+
+		projects := []string{"project1", "project2"}
+
+		// Mock initial ContainerList for all containers
+		gock.New(utils.Docker.DaemonHost()).
+			Get("/v"+utils.Docker.ClientVersion()+"/containers/json").
+			MatchParam("all", "true").
+			Reply(http.StatusOK).
+			JSON([]types.Container{
+				{ID: "container1", Labels: map[string]string{utils.CliProjectLabel: "project1"}},
+				{ID: "container2", Labels: map[string]string{utils.CliProjectLabel: "project2"}},
+			})
+
+		// Mock initial VolumeList
+		gock.New(utils.Docker.DaemonHost()).
+			Get("/v" + utils.Docker.ClientVersion() + "/volumes").
+			Reply(http.StatusOK).
+			JSON(volume.ListResponse{
+				Volumes: []*volume.Volume{
+					{Name: "volume1", Labels: map[string]string{utils.CliProjectLabel: "project1"}},
+					{Name: "volume2", Labels: map[string]string{utils.CliProjectLabel: "project2"}},
+				},
+			})
+
+		// Mock stopOneProject for each project
+		for _, projectId := range projects {
+			// Mock ContainerList for each project
+			gock.New(utils.Docker.DaemonHost()).
+				Get("/v"+utils.Docker.ClientVersion()+"/containers/json").
+				MatchParam("all", "1").
+				MatchParam("filters", fmt.Sprintf(`{"label":{"com.supabase.cli.project=%s":true}}`, projectId)).
+				Reply(http.StatusOK).
+				JSON([]types.Container{{ID: "container-" + projectId, State: "running"}})
+
+			// Mock container stop
+			gock.New(utils.Docker.DaemonHost()).
+				Post("/v" + utils.Docker.ClientVersion() + "/containers/container-" + projectId + "/stop").
+				Reply(http.StatusOK)
+
+			gock.New(utils.Docker.DaemonHost()).
+				Post("/v" + utils.Docker.ClientVersion() + "/containers/prune").
+				Reply(http.StatusOK).
+				JSON(container.PruneReport{})
+			gock.New(utils.Docker.DaemonHost()).
+				Post("/v" + utils.Docker.ClientVersion() + "/networks/prune").
+				Reply(http.StatusOK).
+				JSON(network.PruneReport{})
+			gock.New(utils.Docker.DaemonHost()).
+				Get("/v"+utils.Docker.ClientVersion()+"/volumes").
+				MatchParam("filters", fmt.Sprintf(`{"label":{"com.supabase.cli.project=%s":true}}`, projectId)).
+				Reply(http.StatusOK).
+				JSON(volume.ListResponse{Volumes: []*volume.Volume{{Name: "volume-" + projectId}}})
+		}
+
+		// Mock final ContainerList to verify all containers are stopped
+		gock.New(utils.Docker.DaemonHost()).
+			Get("/v"+utils.Docker.ClientVersion()+"/containers/json").
+			MatchParam("all", "true").
+			Reply(http.StatusOK).
+			JSON([]types.Container{})
+		gock.New(utils.Docker.DaemonHost()).
+			Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
+			Reply(http.StatusOK).
+			JSON([]types.Container{})
+
+		// Run test
+		err := Run(context.Background(), true, "", true, fsys)
+
 		// Check error
 		assert.NoError(t, err)
 		assert.Empty(t, apitest.ListUnmatchedRequests())
@@ -55,7 +138,7 @@ func TestStopCommand(t *testing.T) {
 		// Setup in-memory fs
 		fsys := afero.NewMemMapFs()
 		// Run test
-		err := Run(context.Background(), false, "", fsys)
+		err := Run(context.Background(), false, "", false, fsys)
 		// Check error
 		assert.ErrorIs(t, err, os.ErrNotExist)
 	})
@@ -71,7 +154,7 @@ func TestStopCommand(t *testing.T) {
 			Get("/v" + utils.Docker.ClientVersion() + "/containers/json").
 			Reply(http.StatusServiceUnavailable)
 		// Run test
-		err := Run(context.Background(), false, "test", afero.NewReadOnlyFs(fsys))
+		err := Run(context.Background(), false, "test", false, afero.NewReadOnlyFs(fsys))
 		// Check error
 		assert.ErrorContains(t, err, "request returned Service Unavailable for API route and version")
 		assert.Empty(t, apitest.ListUnmatchedRequests())
@@ -94,13 +177,13 @@ func TestStopServices(t *testing.T) {
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/containers/prune").
 			Reply(http.StatusOK).
-			JSON(types.ContainersPruneReport{})
+			JSON(container.PruneReport{})
 		gock.New(utils.Docker.DaemonHost()).
 			Post("/v" + utils.Docker.ClientVersion() + "/networks/prune").
 			Reply(http.StatusOK).
-			JSON(types.NetworksPruneReport{})
+			JSON(network.PruneReport{})
 		// Run test
-		err := stop(context.Background(), true, io.Discard)
+		err := stop(context.Background(), true, io.Discard, utils.Config.ProjectId)
 		// Check error
 		assert.NoError(t, err)
 		assert.Empty(t, apitest.ListUnmatchedRequests())
@@ -117,7 +200,7 @@ func TestStopServices(t *testing.T) {
 		defer gock.OffAll()
 		apitest.MockDockerStop(utils.Docker)
 		// Run test
-		err := stop(context.Background(), false, io.Discard)
+		err := stop(context.Background(), false, io.Discard, utils.Config.ProjectId)
 		// Check error
 		assert.NoError(t, err)
 		assert.Empty(t, apitest.ListUnmatchedRequests())
@@ -135,7 +218,7 @@ func TestStopServices(t *testing.T) {
 			Post("/v" + utils.Docker.ClientVersion() + "/containers/prune").
 			ReplyError(errors.New("network error"))
 		// Run test
-		err := stop(context.Background(), true, io.Discard)
+		err := stop(context.Background(), true, io.Discard, utils.Config.ProjectId)
 		// Check error
 		assert.ErrorContains(t, err, "network error")
 		assert.Empty(t, apitest.ListUnmatchedRequests())
diff --git a/internal/testing/apitest/docker.go b/internal/testing/apitest/docker.go
index 37f5549e..21a4d7dd 100644
--- a/internal/testing/apitest/docker.go
+++ b/internal/testing/apitest/docker.go
@@ -8,6 +8,7 @@ import (
 	"github.com/docker/docker/api"
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/container"
+	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/volume"
 	"github.com/docker/docker/client"
 	"github.com/docker/docker/pkg/stdcopy"
@@ -38,7 +39,7 @@ func MockDockerStart(docker *client.Client, image, containerID string) {
 	gock.New(docker.DaemonHost()).
 		Post("/v" + docker.ClientVersion() + "/networks/create").
 		Reply(http.StatusCreated).
-		JSON(types.NetworkCreateResponse{})
+		JSON(network.CreateResponse{})
 	gock.New(docker.DaemonHost()).
 		Post("/v" + docker.ClientVersion() + "/volumes/create").
 		Persist().
@@ -62,15 +63,15 @@ func MockDockerStop(docker *client.Client) {
 	gock.New(docker.DaemonHost()).
 		Post("/v" + docker.ClientVersion() + "/containers/prune").
 		Reply(http.StatusOK).
-		JSON(types.ContainersPruneReport{})
+		JSON(container.PruneReport{})
 	gock.New(docker.DaemonHost()).
 		Post("/v" + docker.ClientVersion() + "/volumes/prune").
 		Reply(http.StatusOK).
-		JSON(types.VolumesPruneReport{})
+		JSON(volume.PruneReport{})
 	gock.New(docker.DaemonHost()).
 		Post("/v" + docker.ClientVersion() + "/networks/prune").
 		Reply(http.StatusOK).
-		JSON(types.NetworksPruneReport{})
+		JSON(network.PruneReport{})
 }
 
 // Ref: internal/utils/docker.go::DockerRunOnce
diff --git a/internal/unlink/unlink_test.go b/internal/unlink/unlink_test.go
index e8bd284b..9b526e10 100644
--- a/internal/unlink/unlink_test.go
+++ b/internal/unlink/unlink_test.go
@@ -23,7 +23,7 @@ func TestUnlinkCommand(t *testing.T) {
 		fsys := afero.NewMemMapFs()
 		require.NoError(t, afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644))
 		// Save database password
-		require.NoError(t, credentials.Set(project, "test"))
+		require.NoError(t, credentials.StoreProvider.Set(project, "test"))
 		// Run test
 		err := Run(context.Background(), fsys)
 		// Check error
@@ -33,7 +33,7 @@ func TestUnlinkCommand(t *testing.T) {
 		assert.NoError(t, err)
 		assert.False(t, exists)
 		// Check credentials does not exist
-		_, err = credentials.Get(project)
+		_, err = credentials.StoreProvider.Get(project)
 		assert.ErrorIs(t, err, keyring.ErrNotFound)
 	})
 
diff --git a/internal/utils/access_token_test.go b/internal/utils/access_token_test.go
index 84615848..f3198887 100644
--- a/internal/utils/access_token_test.go
+++ b/internal/utils/access_token_test.go
@@ -165,7 +165,7 @@ func TestSaveTokenFallback(t *testing.T) {
 func TestDeleteToken(t *testing.T) {
 	t.Run("deletes both keyring and fallback", func(t *testing.T) {
 		token := string(apitest.RandomAccessToken(t))
-		require.NoError(t, credentials.Set(AccessTokenKey, token))
+		require.NoError(t, credentials.StoreProvider.Set(AccessTokenKey, token))
 		// Setup in-memory fs
 		fsys := afero.NewMemMapFs()
 		require.NoError(t, fallbackSaveToken(token, fsys))
@@ -173,7 +173,7 @@ func TestDeleteToken(t *testing.T) {
 		err := DeleteAccessToken(fsys)
 		// Check error
 		assert.NoError(t, err)
-		_, err = credentials.Get(AccessTokenKey)
+		_, err = credentials.StoreProvider.Get(AccessTokenKey)
 		assert.ErrorIs(t, err, keyring.ErrNotFound)
 		path, err := getAccessTokenPath()
 		assert.NoError(t, err)
diff --git a/internal/utils/credentials/keyring_test.go b/internal/utils/credentials/keyring_test.go
new file mode 100644
index 00000000..0569276a
--- /dev/null
+++ b/internal/utils/credentials/keyring_test.go
@@ -0,0 +1,28 @@
+package credentials
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/zalando/go-keyring"
+)
+
+func TestDeleteAll(t *testing.T) {
+	service := "test-cli"
+	// Nothing to delete
+	err := deleteAll(service)
+	assert.NoError(t, err)
+	// Setup 2 items
+	err = keyring.Set(service, "key1", "value")
+	assert.NoError(t, err)
+	err = keyring.Set(service, "key2", "value")
+	assert.NoError(t, err)
+	// Delete all items
+	err = deleteAll(service)
+	assert.NoError(t, err)
+	// Check items are gone
+	_, err = keyring.Get(service, "key1")
+	assert.ErrorIs(t, err, keyring.ErrNotFound)
+	_, err = keyring.Get(service, "key2")
+	assert.ErrorIs(t, err, keyring.ErrNotFound)
+}
diff --git a/internal/utils/docker_test.go b/internal/utils/docker_test.go
index a3f92bd0..6a0cdf03 100644
--- a/internal/utils/docker_test.go
+++ b/internal/utils/docker_test.go
@@ -9,6 +9,7 @@ import (
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/container"
+	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/pkg/jsonmessage"
 	"github.com/docker/docker/pkg/stdcopy"
 	"github.com/h2non/gock"
@@ -133,7 +134,7 @@ func TestRunOnce(t *testing.T) {
 		gock.New(Docker.DaemonHost()).
 			Post("/v" + Docker.ClientVersion() + "/networks/create").
 			Reply(http.StatusCreated).
-			JSON(types.NetworkCreateResponse{})
+			JSON(network.CreateResponse{})
 		gock.New(Docker.DaemonHost()).
 			Post("/v" + Docker.ClientVersion() + "/containers/create").
 			Reply(http.StatusServiceUnavailable)
@@ -155,7 +156,7 @@ func TestRunOnce(t *testing.T) {
 		gock.New(Docker.DaemonHost()).
 			Post("/v" + Docker.ClientVersion() + "/networks/create").
 			Reply(http.StatusCreated).
-			JSON(types.NetworkCreateResponse{})
+			JSON(network.CreateResponse{})
 		gock.New(Docker.DaemonHost()).
 			Post("/v" + Docker.ClientVersion() + "/containers/create").
 			Reply(http.StatusOK).
diff --git a/pkg/migration/seed_test.go b/pkg/migration/seed_test.go
index cf88a818..e81d814a 100644
--- a/pkg/migration/seed_test.go
+++ b/pkg/migration/seed_test.go
@@ -52,11 +52,11 @@ func TestSeedData(t *testing.T) {
 	})
 }
 
-//go:embed testdata/globals.sql
+//go:embed testdata/1_globals.sql
 var testGlobals string
 
 func TestSeedGlobals(t *testing.T) {
-	pending := []string{"testdata/globals.sql"}
+	pending := []string{"testdata/1_globals.sql"}
 
 	t.Run("seeds from file", func(t *testing.T) {
 		// Setup mock postgres
diff --git a/pkg/migration/testdata/globals.sql b/pkg/migration/testdata/1_globals.sql
similarity index 100%
rename from pkg/migration/testdata/globals.sql
rename to pkg/migration/testdata/1_globals.sql
diff --git a/test/branch_test.go b/test/branch_test.go
index a3d86902..07d3608d 100644
--- a/test/branch_test.go
+++ b/test/branch_test.go
@@ -5,7 +5,7 @@ import (
 	"encoding/json"
 	"os"
 
-	"github.com/docker/docker/api/types"
+	"github.com/docker/docker/api/types/container"
 	"github.com/stretchr/testify/require"
 )
 
@@ -31,8 +31,8 @@ func (suite *DBTestSuite) TestBranchCreate() {
 
 	// check commands in exec calls
 	require.Equal(suite.T(), 2, len(suite.bodies))
-	var execBody types.ExecConfig
+	var execBody container.ExecOptions
 	require.NoError(suite.T(), json.Unmarshal([]byte(suite.bodies[0]), &execBody))
-	var startBody types.ExecStartCheck
+	var startBody container.ExecStartOptions
 	require.NoError(suite.T(), json.Unmarshal([]byte(suite.bodies[1]), &startBody))
 }
diff --git a/test/login_test.go b/test/login_test.go
index 81f9cb89..2f1e018f 100644
--- a/test/login_test.go
+++ b/test/login_test.go
@@ -5,7 +5,6 @@ import (
 	"context"
 	"net/http"
 	"os"
-	"path/filepath"
 	"sync"
 	"testing"
 
@@ -57,13 +56,13 @@ func (suite *LoginTestSuite) TestLink() {
 	require.NoError(suite.T(), login.RunE(login, []string{}))
 
 	// check token is saved
-	home, err := os.UserHomeDir()
-	require.NoError(suite.T(), err)
-	_, err = os.Stat(filepath.Join(home, ".supabase/access-token"))
-	require.NoError(suite.T(), err)
-	token, err := os.ReadFile(filepath.Join(home, ".supabase/access-token"))
-	require.NoError(suite.T(), err)
-	require.Equal(suite.T(), key, string(token))
+	// home, err := os.UserHomeDir()
+	// require.NoError(suite.T(), err)
+	// _, err = os.Stat(filepath.Join(home, ".supabase/access-token"))
+	// require.NoError(suite.T(), err)
+	// token, err := os.ReadFile(filepath.Join(home, ".supabase/access-token"))
+	// require.NoError(suite.T(), err)
+	// require.Equal(suite.T(), key, string(token))
 }
 
 // hooks