Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
39d0464
chore: update kernel-go-sdk to v0.107.0
kernel-internal[bot] Sep 16, 2026
a63dd37
Merge main into cli-coverage-update
kernel-internal[bot] Sep 17, 2026
74e93b3
chore: bump Go SDK to 51d7fb8 (v0.107.1-0.20260917184535)
kernel-internal[bot] Sep 17, 2026
627c950
chore: bump Go SDK to v0.108.0 (3556e00)
kernel-internal[bot] Sep 17, 2026
7a8a71e
chore: bump Go SDK to 6367486 and show org concurrency usage
kernel-internal[bot] Sep 17, 2026
6643d5d
Update Go SDK to 3038f83 and adopt ordered credential fields
kernel-internal[bot] Sep 17, 2026
7176b47
chore: bump Go SDK to 5cfcedd and document opaque AgentCard card IDs
kernel-internal[bot] Sep 17, 2026
0601cdf
chore: bump Go SDK to v0.109.0 (5c91a27)
kernel-internal[bot] Sep 17, 2026
086f25e
Merge main into cli-coverage-update
kernel-internal[bot] Sep 18, 2026
51d6810
Update SDK to c4dc2a2 and surface credential field labels
kernel-internal[bot] Sep 18, 2026
5c5dc62
chore: bump Go SDK to released v0.110.0 (a414a68)
kernel-internal[bot] Sep 18, 2026
d53e6ed
Merge main into cli-coverage-update
kernel-internal[bot] Sep 18, 2026
863ed39
chore: bump Go SDK to 6e379e6 (proxy_error raw_code)
kernel-internal[bot] Sep 18, 2026
46ca7ed
feat: Update Go SDK to dd9a4a4 and accept adyen checkout processor
kernel-internal[bot] Sep 21, 2026
345a60d
chore: bump Go SDK to 68c5100 (optimistic managed auth reauth)
kernel-internal[bot] Sep 21, 2026
b6f9f2a
chore: bump Go SDK to ca8d465 and surface managed auth completion times
kernel-internal[bot] Sep 21, 2026
e7efb10
feat: add --skill-mode to auth connections login, bump SDK
kernel-internal[bot] Sep 21, 2026
f3bd1bb
feat: add kernel search commands, bump Go SDK to 0554699
kernel-internal[bot] Sep 22, 2026
f50d037
chore: bump Go SDK to v0.111.0 (df8b441)
kernel-internal[bot] Sep 22, 2026
2806722
chore: bump Go SDK to 1ef7b7c
kernel-internal[bot] Sep 22, 2026
846f841
chore: bump Go SDK to 0584ea1
kernel-internal[bot] Sep 22, 2026
2cb6fc8
Merge main into cli-coverage-update
kernel-internal[bot] Sep 23, 2026
dfcd804
Update Go SDK to a9ee57c and filter telemetry events by type server-side
kernel-internal[bot] Sep 23, 2026
adf8f7d
Update Go SDK to b50814f and add profile flags to pool acquire
kernel-internal[bot] Sep 23, 2026
0ca9f8c
Remove duplicate search command registration left by merge
kernel-internal[bot] Sep 23, 2026
ab1c8c2
Update Go SDK to 8e055e1 and show Search entitlement in org entitlements
kernel-internal[bot] Sep 24, 2026
f3b9f8e
Update Go SDK to ffc38db and add --proxy-route to browsers create
kernel-internal[bot] Sep 24, 2026
3e77f83
Update Go SDK to 47c1310 and add WebMCP custom-tools commands
kernel-internal[bot] Sep 24, 2026
572718b
Update Go SDK to v0.112.0 (247bcf1)
kernel-internal[bot] Sep 24, 2026
10d4416
Merge main into cli-coverage-update
kernel-internal[bot] Sep 26, 2026
39a0426
Update Go SDK to 140c57d and fix merge fallout from main
kernel-internal[bot] Sep 26, 2026
ac54b90
Update Go SDK to 8dcb671 and add --memory to browser-pools create/update
kernel-internal[bot] Sep 27, 2026
fc7410c
Update Go SDK to v0.113.0 (2e3561a)
kernel-internal[bot] Sep 27, 2026
3d279b2
Update Go SDK to 233b087 and surface telemetry storage state
kernel-internal[bot] Sep 28, 2026
f715c8f
Update Go SDK to a1d4c5b and add --telemetry-storage
kernel-internal[bot] Sep 28, 2026
2365821
Document --telemetry-storage in README
kernel-internal[bot] Sep 28, 2026
5f7ca41
Update Go SDK to 35a0285 and surface health check unavailable reason
kernel-internal[bot] Sep 28, 2026
d230fe4
Update Go SDK to 6923472 and send the kernel credential provider
kernel-internal[bot] Sep 29, 2026
c2926c6
Update Go SDK to c823c6c and add --publishable-key for Link provider …
kernel-internal[bot] Sep 30, 2026
12f52b1
Update Go SDK to b307cc1 (v0.114.0)
kernel-internal[bot] Sep 30, 2026
d99512c
Merge remote-tracking branch 'origin/main' into cli-coverage-update
rgarcia Sep 30, 2026
c5099de
Remove undocumented search contents command from README
rgarcia Sep 30, 2026
37a5f3b
Update Go SDK to e7afbaf and add search contents command
kernel-internal[bot] Sep 30, 2026
3a4de4f
Update Go SDK to c393858 (v0.115.0)
kernel-internal[bot] Sep 30, 2026
29b2105
Update Go SDK to e746d99 and support AgentCard checkout_origin
kernel-internal[bot] Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 103 additions & 12 deletions README.md

Large diffs are not rendered by default.

67 changes: 63 additions & 4 deletions cmd/auth_connections.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ type AuthConnectionCreateInput struct {
Telemetry string
TelemetryCdpExclude string
TelemetryExport string
TelemetryStorage string
Output string
}

Expand Down Expand Up @@ -97,6 +98,7 @@ type AuthConnectionUpdateInput struct {
Telemetry string
TelemetryCdpExclude string
TelemetryExport string
TelemetryStorage string
Output string
}

Expand All @@ -122,9 +124,11 @@ type AuthConnectionLoginInput struct {
Region string
Stealth BoolFlag
RecordSession BoolFlag
SkillMode string
Telemetry string
TelemetryCdpExclude string
TelemetryExport string
TelemetryStorage string
Output string
}

Expand Down Expand Up @@ -251,11 +255,16 @@ func (c AuthConnectionCmd) Create(ctx context.Context, in AuthConnectionCreateIn
params.ManagedAuthCreateRequest.RecordSession = kernel.Opt(in.RecordSession.Value)
}

if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" {
if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" || in.TelemetryStorage != "" {
t, err := buildManagedAuthTelemetryParam(in.Telemetry, in.TelemetryCdpExclude, in.TelemetryExport, true)
if err != nil {
return err
}
storage, err := resolveTelemetryStorageFlag(in.TelemetryStorage, in.Telemetry, in.TelemetryExport, true)
if err != nil {
return err
}
t.Storage.Enabled = storage
params.ManagedAuthCreateRequest.Browser.Telemetry = t
}

Expand Down Expand Up @@ -412,11 +421,16 @@ func (c AuthConnectionCmd) Update(ctx context.Context, in AuthConnectionUpdateIn
hasChanges = true
}

if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" {
if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" || in.TelemetryStorage != "" {
t, err := buildManagedAuthTelemetryParam(in.Telemetry, in.TelemetryCdpExclude, in.TelemetryExport, false)
if err != nil {
return err
}
storage, err := resolveTelemetryStorageFlag(in.TelemetryStorage, in.Telemetry, in.TelemetryExport, false)
if err != nil {
return err
}
t.Storage.Enabled = storage
params.ManagedAuthUpdateRequest.Browser.Telemetry = t
hasChanges = true
}
Expand Down Expand Up @@ -692,6 +706,9 @@ func (c AuthConnectionCmd) Get(ctx context.Context, in AuthConnectionGetInput) e
if auth.HealthCheckInterval > 0 {
tableData = append(tableData, []string{"Health Check Interval", fmt.Sprintf("%d seconds", auth.HealthCheckInterval)})
}
if auth.HealthCheckUnavailableReason != "" {
tableData = append(tableData, []string{"Health Check Unavailable", string(auth.HealthCheckUnavailableReason)})
}
if auth.BrowserSessionID != "" {
tableData = append(tableData, []string{"Browser Session ID", auth.BrowserSessionID})
}
Expand Down Expand Up @@ -794,6 +811,20 @@ func (c AuthConnectionCmd) Delete(ctx context.Context, in AuthConnectionDeleteIn
return nil
}

// parseSkillModeFlag validates the --skill-mode value against the modes the API
// accepts for a login, so a typo fails locally instead of starting a flow with
// the wrong skill behavior.
func parseSkillModeFlag(mode string) (kernel.AuthConnectionLoginParamsSkillMode, error) {
switch kernel.AuthConnectionLoginParamsSkillMode(mode) {
case kernel.AuthConnectionLoginParamsSkillModeEnabled:
return kernel.AuthConnectionLoginParamsSkillModeEnabled, nil
case kernel.AuthConnectionLoginParamsSkillModeDisabled:
return kernel.AuthConnectionLoginParamsSkillModeDisabled, nil
default:
return "", fmt.Errorf("invalid --skill-mode value: %s (must be one of enabled, disabled)", mode)
}
}

func (c AuthConnectionCmd) Login(ctx context.Context, in AuthConnectionLoginInput) error {
if err := validateJSONOutput(in.Output); err != nil {
return err
Expand Down Expand Up @@ -825,11 +856,24 @@ func (c AuthConnectionCmd) Login(ctx context.Context, in AuthConnectionLoginInpu
params.RecordSession = kernel.Opt(in.RecordSession.Value)
}

if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" {
if in.SkillMode != "" {
mode, err := parseSkillModeFlag(in.SkillMode)
if err != nil {
return err
}
params.SkillMode = mode
}

if in.Telemetry != "" || in.TelemetryCdpExclude != "" || in.TelemetryExport != "" || in.TelemetryStorage != "" {
t, err := buildManagedAuthTelemetryParam(in.Telemetry, in.TelemetryCdpExclude, in.TelemetryExport, false)
if err != nil {
return err
}
storage, err := resolveTelemetryStorageFlag(in.TelemetryStorage, in.Telemetry, in.TelemetryExport, false)
if err != nil {
return err
}
t.Storage.Enabled = storage
params.Browser.Telemetry = t
}

Expand Down Expand Up @@ -1069,7 +1113,7 @@ func (c AuthConnectionCmd) Timeline(ctx context.Context, in AuthConnectionTimeli
return nil
}

tableData := pterm.TableData{{"Timestamp", "Type", "Status", "Step", "Browser Session", "Telemetry", "Details"}}
tableData := pterm.TableData{{"Timestamp", "Completed", "Type", "Status", "Step", "Browser Session", "Telemetry", "Details"}}
for _, e := range events {
details := e.ErrorMessage
if details == "" {
Expand All @@ -1087,6 +1131,9 @@ func (c AuthConnectionCmd) Timeline(ctx context.Context, in AuthConnectionTimeli
}
tableData = append(tableData, []string{
util.FormatLocal(e.Timestamp),
// Absent (dashed out) for in-progress attempts, health checks, and
// older attempts recorded before completion times were persisted.
util.FormatLocal(e.CompletedAt),
string(e.Type),
string(e.Status),
string(e.Step),
Expand Down Expand Up @@ -1325,6 +1372,7 @@ func init() {
authConnectionsCreateCmd.Flags().Bool("record-session", false, "Record browser sessions for this connection by default (useful for debugging)")
authConnectionsCreateCmd.Flags().String("telemetry", "", "Configure telemetry for this connection's browser sessions (opt-in): --telemetry=all (default set), --telemetry=off (disable), or --telemetry=console,network (capture exactly those categories)")
authConnectionsCreateCmd.Flags().String("telemetry-export-otlp", "", "Export this connection's captured telemetry over OTLP to one of the org's configured destinations, by ID or name; --telemetry-export-otlp=off disables export. Implies --telemetry=all when --telemetry is not set, since export requires capture")
authConnectionsCreateCmd.Flags().String("telemetry-storage", "", "Whether this connection's browser sessions persist captured telemetry to Kernel storage: on (default) or off. Turning storage off requires --telemetry-export-otlp=<destination> in the same command, so events are only available on the live stream and through the export")
authConnectionsCreateCmd.Flags().String("telemetry-cdp-exclude", "", "Leave the named CDP methods out of control telemetry's cdp_command events, comma-separated (e.g. Input.dispatchMouseEvent,Page.captureScreenshot); --telemetry-cdp-exclude=none clears the list. Excluded commands are still relayed to the browser, they just produce no event")
_ = authConnectionsCreateCmd.MarkFlagRequired("domain")
_ = authConnectionsCreateCmd.MarkFlagRequired("profile-name")
Expand Down Expand Up @@ -1356,6 +1404,7 @@ func init() {
authConnectionsUpdateCmd.Flags().Bool("record-session", false, "Set whether browser sessions are recorded by default; use --record-session=false to disable")
authConnectionsUpdateCmd.Flags().String("telemetry", "", "Update telemetry for future browser sessions: --telemetry=all (reset to default set), --telemetry=off (disable), or --telemetry=console,network (merge those categories into the current selection)")
authConnectionsUpdateCmd.Flags().String("telemetry-export-otlp", "", "Update where future sessions export captured telemetry over OTLP, by destination ID or name; --telemetry-export-otlp=off disables export. Naming a destination requires passing --telemetry in the same command, since export and capture are validated together")
authConnectionsUpdateCmd.Flags().String("telemetry-storage", "", "Update whether future sessions persist captured telemetry to Kernel storage: on or off. Requires --telemetry in the same command; turning storage off also requires --telemetry-export-otlp=<destination>")
authConnectionsUpdateCmd.Flags().String("telemetry-cdp-exclude", "", "Leave the named CDP methods out of control telemetry's cdp_command events, comma-separated (e.g. Input.dispatchMouseEvent,Page.captureScreenshot); --telemetry-cdp-exclude=none clears the list. Excluded commands are still relayed to the browser, they just produce no event")
authConnectionsUpdateCmd.MarkFlagsMutuallyExclusive("credential-name", "credential-provider")
authConnectionsUpdateCmd.MarkFlagsMutuallyExclusive("save-credentials", "no-save-credentials")
Expand All @@ -1381,8 +1430,10 @@ func init() {
authConnectionsLoginCmd.Flags().String("region", "", "Geographic region override for this login: 'us-east', 'eu-west', or 'ap-southeast'")
authConnectionsLoginCmd.Flags().Bool("stealth", true, "Override stealth mode for this login's browser session; use --stealth=false to disable")
authConnectionsLoginCmd.Flags().Bool("record-session", false, "Override whether this login's browser session is recorded; use --record-session=false to disable")
authConnectionsLoginCmd.Flags().String("skill-mode", "", "Whether this login reads and writes learned domain skills: 'enabled' (default) or 'disabled'. Automatic reauths inherit the selected mode until a later accepted login sets enabled or omits the flag")
authConnectionsLoginCmd.Flags().String("telemetry", "", "Telemetry override for this login only, merged onto the connection's config: --telemetry=all, --telemetry=off, or --telemetry=console,network")
authConnectionsLoginCmd.Flags().String("telemetry-export-otlp", "", "Export override for this login only: an OTLP destination ID or name; --telemetry-export-otlp=off disables export for this login. Naming a destination requires passing --telemetry in the same command, since export and capture are validated together")
authConnectionsLoginCmd.Flags().String("telemetry-storage", "", "Storage override for this login only: on or off. Requires --telemetry in the same command; turning storage off also requires --telemetry-export-otlp=<destination>")
authConnectionsLoginCmd.Flags().String("telemetry-cdp-exclude", "", "Leave the named CDP methods out of control telemetry's cdp_command events, comma-separated (e.g. Input.dispatchMouseEvent,Page.captureScreenshot); --telemetry-cdp-exclude=none clears the list. Excluded commands are still relayed to the browser, they just produce no event")

// Submit flags
Expand Down Expand Up @@ -1441,6 +1492,7 @@ func runAuthConnectionsCreate(cmd *cobra.Command, args []string) error {
telemetry, _ := cmd.Flags().GetString("telemetry")
telemetryCdpExclude, _ := cmd.Flags().GetString("telemetry-cdp-exclude")
telemetryExport, _ := cmd.Flags().GetString("telemetry-export-otlp")
telemetryStorage, _ := cmd.Flags().GetString("telemetry-storage")

svc := client.Auth.Connections
c := AuthConnectionCmd{svc: &svc}
Expand All @@ -1466,6 +1518,7 @@ func runAuthConnectionsCreate(cmd *cobra.Command, args []string) error {
Telemetry: telemetry,
TelemetryCdpExclude: telemetryCdpExclude,
TelemetryExport: telemetryExport,
TelemetryStorage: telemetryStorage,
Output: output,
})
}
Expand Down Expand Up @@ -1501,6 +1554,7 @@ func runAuthConnectionsUpdate(cmd *cobra.Command, args []string) error {
telemetry, _ := cmd.Flags().GetString("telemetry")
telemetryCdpExclude, _ := cmd.Flags().GetString("telemetry-cdp-exclude")
telemetryExport, _ := cmd.Flags().GetString("telemetry-export-otlp")
telemetryStorage, _ := cmd.Flags().GetString("telemetry-storage")

saveCredentialsFlag := BoolFlag{}

Expand Down Expand Up @@ -1556,6 +1610,7 @@ func runAuthConnectionsUpdate(cmd *cobra.Command, args []string) error {
Telemetry: telemetry,
TelemetryCdpExclude: telemetryCdpExclude,
TelemetryExport: telemetryExport,
TelemetryStorage: telemetryStorage,
Output: output,
})
}
Expand Down Expand Up @@ -1600,9 +1655,11 @@ func runAuthConnectionsLogin(cmd *cobra.Command, args []string) error {
proxyName, _ := cmd.Flags().GetString("proxy-name")
proxyMode, _ := cmd.Flags().GetString("proxy-mode")
region, _ := cmd.Flags().GetString("region")
skillMode, _ := cmd.Flags().GetString("skill-mode")
telemetry, _ := cmd.Flags().GetString("telemetry")
telemetryCdpExclude, _ := cmd.Flags().GetString("telemetry-cdp-exclude")
telemetryExport, _ := cmd.Flags().GetString("telemetry-export-otlp")
telemetryStorage, _ := cmd.Flags().GetString("telemetry-storage")

svc := client.Auth.Connections
c := AuthConnectionCmd{svc: &svc}
Expand All @@ -1614,9 +1671,11 @@ func runAuthConnectionsLogin(cmd *cobra.Command, args []string) error {
Region: region,
Stealth: readBoolFlag(cmd.Flags(), "stealth"),
RecordSession: readBoolFlag(cmd.Flags(), "record-session"),
SkillMode: skillMode,
Telemetry: telemetry,
TelemetryCdpExclude: telemetryCdpExclude,
TelemetryExport: telemetryExport,
TelemetryStorage: telemetryStorage,
Output: output,
})
}
Expand Down
71 changes: 70 additions & 1 deletion cmd/auth_connections_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/http/httptest"
"os"
"testing"
"time"

"github.com/kernel/cli/pkg/util"
"github.com/kernel/kernel-go-sdk"
Expand Down Expand Up @@ -137,6 +138,30 @@ func TestAuthConnectionsGet_PrintsSubmissionHints(t *testing.T) {
assert.Contains(t, out, "Continue with Google")
}

func TestAuthConnectionsGet_PrintsHealthCheckUnavailableReason(t *testing.T) {
setupStdoutCapture(t)

fake := &FakeAuthConnectionService{
GetFunc: func(ctx context.Context, id string, opts ...option.RequestOption) (*kernel.ManagedAuth, error) {
return &kernel.ManagedAuth{
ID: id,
Domain: "example.com",
ProfileName: "profile-1",
Status: kernel.ManagedAuthStatusAuthenticated,
HealthCheckUnavailableReason: kernel.ManagedAuthHealthCheckUnavailableReasonNoAuthCheckURL,
}, nil
},
}
c := AuthConnectionCmd{svc: fake}

err := c.Get(context.Background(), AuthConnectionGetInput{ID: "conn-1"})
require.NoError(t, err)

out := outBuf.String()
assert.Contains(t, out, "Health Check Unavailable")
assert.Contains(t, out, "no_auth_check_url")
}

// TestAuthConnectionsGet_PrintsCanonicalInputMetadata covers the metadata the
// API preserves on canonical fields and choices: the field hint naming a masked
// code destination, and the MFA type and masked destination that distinguish
Expand Down Expand Up @@ -1223,7 +1248,8 @@ func TestTimeline_RendersEventsAndPagination(t *testing.T) {
"type": "login",
"status": "SUCCESS",
"browser_session_id": "browser_1",
"telemetry_captured": true
"telemetry_captured": true,
"completed_at": "2026-09-21T12:00:00Z"
}`), &loginEvent))
fake := &FakeAuthConnectionService{
TimelineFunc: func(ctx context.Context, id string, query kernel.AuthConnectionTimelineParams, opts ...option.RequestOption) (*pagination.OffsetPagination[kernel.ManagedAuthTimelineEvent], error) {
Expand Down Expand Up @@ -1252,6 +1278,9 @@ func TestTimeline_RendersEventsAndPagination(t *testing.T) {
// Telemetry capture is reported for events that have a browser session.
assert.Contains(t, out, "Telemetry")
assert.Regexp(t, `browser_1.*yes`, out)
// completed_at is shown for terminal attempts and dashed out otherwise.
assert.Contains(t, out, "Completed")
assert.Contains(t, out, util.FormatLocal(time.Date(2026, 9, 21, 12, 0, 0, 0, time.UTC)))
// The third event is truncated off the page.
assert.NotContains(t, out, "health_check")
assert.Contains(t, out, "Has more: yes")
Expand Down Expand Up @@ -1390,3 +1419,43 @@ func TestAuthConnectionsGet_TelemetryRowOmittedWhenOff(t *testing.T) {
require.NoError(t, c.Get(context.Background(), AuthConnectionGetInput{ID: "conn-1"}))
assert.NotContains(t, outBuf.String(), "Browser Telemetry")
}

func TestLogin_SkillMode(t *testing.T) {
capturePtermOutput(t)
var captured kernel.AuthConnectionLoginParams
fake := &FakeAuthConnectionService{
LoginFunc: func(ctx context.Context, id string, body kernel.AuthConnectionLoginParams, opts ...option.RequestOption) (*kernel.LoginResponse, error) {
captured = body
return &kernel.LoginResponse{ID: id}, nil
},
}
c := AuthConnectionCmd{svc: fake}
require.NoError(t, c.Login(context.Background(), AuthConnectionLoginInput{ID: "auth_1", SkillMode: "disabled"}))
assert.Equal(t, kernel.AuthConnectionLoginParamsSkillModeDisabled, captured.SkillMode)
}

// Omitting --skill-mode leaves the field unset, so the API keeps its default of
// enabled rather than the CLI pinning a mode the user never asked for.
func TestLogin_SkillModeOmitted(t *testing.T) {
capturePtermOutput(t)
var captured kernel.AuthConnectionLoginParams
fake := &FakeAuthConnectionService{
LoginFunc: func(ctx context.Context, id string, body kernel.AuthConnectionLoginParams, opts ...option.RequestOption) (*kernel.LoginResponse, error) {
captured = body
return &kernel.LoginResponse{ID: id}, nil
},
}
c := AuthConnectionCmd{svc: fake}
require.NoError(t, c.Login(context.Background(), AuthConnectionLoginInput{ID: "auth_1"}))
assert.Empty(t, string(captured.SkillMode))
}

func TestLogin_InvalidSkillModeErrors(t *testing.T) {
capturePtermOutput(t)
c := AuthConnectionCmd{svc: &FakeAuthConnectionService{}}

err := c.Login(context.Background(), AuthConnectionLoginInput{ID: "auth_1", SkillMode: "mars"})

require.Error(t, err)
assert.Contains(t, err.Error(), "invalid --skill-mode value")
}
Loading
Loading