Skip to content

Commit da1c511

Browse files
authored
Remove -y flag from browsers delete, make non-interactive (#85)
## Summary - Remove the `-y/--yes` confirmation flag from `kernel browsers delete` - Make browser deletion non-interactive by default The confirmation prompt was overly cautious and not necessary: 1. **LLM compatibility**: The `-y` flag frequently trips up LLMs that use the CLI - they either forget to pass it or get stuck waiting for interactive confirmation that never comes in their execution environment. 2. **Idempotent operation**: Browser deletion is already idempotent (deleting a non-existent browser succeeds), so requiring confirmation adds friction without meaningful protection. 3. **Consistency**: Other delete commands in the CLI (like browser session cleanup) don't require confirmation. ## Test plan - [x] Existing browser delete tests updated and passing - [x] `go build ./...` succeeds - [x] Manual verification: `kernel browsers delete <id>` now deletes without prompting <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Makes `kernel browsers delete` non-interactive and removes confirmation flags. > > - Removes `-y/--yes` flag and all interactive confirmation logic from `BrowsersCmd.Delete`; command is now idempotent and non-interactive > - `Delete` now tries `DeleteByID` then persistent delete, treating not-found as success; prints a single success message > - Removes flag wiring and usage of `--yes` in CLI (`runBrowsersDelete`) and README examples > - Updates tests to match the new behavior and deletes confirm-path test cases > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 5b74b84. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 55a2524 commit da1c511

3 files changed

Lines changed: 8 additions & 55 deletions

File tree

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ Commands with JSON output support:
213213
- `--output json`, `-o json` - Output raw JSON object
214214
- _Note: When a pool is specified, omit other session configuration flags—pool settings determine profile, proxy, viewport, etc._
215215
- `kernel browsers delete <id>` - Delete a browser
216-
- `-y, --yes` - Skip confirmation prompt
217216
- `kernel browsers view <id>` - Get live view URL for a browser
218217
- `--output json`, `-o json` - Output JSON with liveViewUrl
219218
- `kernel browsers get <id>` - Get detailed browser session info
@@ -519,7 +518,7 @@ kernel browsers create --kiosk
519518
kernel browsers create --profile-name my-profile
520519

521520
# Delete a browser
522-
kernel browsers delete browser123 --yes
521+
kernel browsers delete browser123
523522

524523
# Get live view URL
525524
kernel browsers view browser123

cmd/browsers.go

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ type BrowsersCreateInput struct {
168168
}
169169

170170
type BrowsersDeleteInput struct {
171-
Identifier string
172-
SkipConfirm bool
171+
Identifier string
173172
}
174173

175174
type BrowsersViewInput struct {
@@ -406,39 +405,7 @@ func buildBrowserTableData(sessionID, cdpURL, liveViewURL string, persistence ke
406405
}
407406

408407
func (b BrowsersCmd) Delete(ctx context.Context, in BrowsersDeleteInput) error {
409-
if !in.SkipConfirm {
410-
found, err := b.browsers.Get(ctx, in.Identifier)
411-
if err != nil {
412-
return util.CleanedUpSdkError{Err: err}
413-
}
414-
415-
confirmMsg := fmt.Sprintf("Are you sure you want to delete browser \"%s\"?", in.Identifier)
416-
pterm.DefaultInteractiveConfirm.DefaultText = confirmMsg
417-
result, _ := pterm.DefaultInteractiveConfirm.Show()
418-
if !result {
419-
pterm.Info.Println("Deletion cancelled")
420-
return nil
421-
}
422-
423-
if found.Persistence.ID == in.Identifier {
424-
err = b.browsers.Delete(ctx, kernel.BrowserDeleteParams{PersistentID: in.Identifier})
425-
if err != nil && !util.IsNotFound(err) {
426-
return util.CleanedUpSdkError{Err: err}
427-
}
428-
pterm.Success.Printf("Successfully deleted browser: %s\n", in.Identifier)
429-
return nil
430-
}
431-
432-
pterm.Info.Printf("Deleting browser: %s\n", in.Identifier)
433-
err = b.browsers.DeleteByID(ctx, in.Identifier)
434-
if err != nil && !util.IsNotFound(err) {
435-
return util.CleanedUpSdkError{Err: err}
436-
}
437-
pterm.Success.Printf("Successfully deleted browser: %s\n", in.Identifier)
438-
return nil
439-
}
440-
441-
// Skip confirmation: try both deletion modes without listing first
408+
// Try both deletion modes without confirmation
442409
// Treat not found as a success (idempotent delete)
443410
var nonNotFoundErrors []error
444411

@@ -2145,8 +2112,6 @@ func init() {
21452112
browsersCreateCmd.Flags().String("pool-id", "", "Browser pool ID to acquire from (mutually exclusive with --pool-name)")
21462113
browsersCreateCmd.Flags().String("pool-name", "", "Browser pool name to acquire from (mutually exclusive with --pool-id)")
21472114

2148-
// Add flags for delete command
2149-
browsersDeleteCmd.Flags().BoolP("yes", "y", false, "Skip confirmation prompt")
21502115

21512116
// no flags for view; it takes a single positional argument
21522117
}
@@ -2305,13 +2270,12 @@ func runBrowsersCreate(cmd *cobra.Command, args []string) error {
23052270

23062271
func runBrowsersDelete(cmd *cobra.Command, args []string) error {
23072272
client := getKernelClient(cmd)
2308-
skipConfirm, _ := cmd.Flags().GetBool("yes")
23092273

23102274
svc := client.Browsers
23112275
b := BrowsersCmd{browsers: &svc}
23122276
// Iterate all provided identifiers
23132277
for _, identifier := range args {
2314-
if err := b.Delete(cmd.Context(), BrowsersDeleteInput{Identifier: identifier, SkipConfirm: skipConfirm}); err != nil {
2278+
if err := b.Delete(cmd.Context(), BrowsersDeleteInput{Identifier: identifier}); err != nil {
23152279
return err
23162280
}
23172281
}

cmd/browsers_test.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ func TestBrowsersCreate_PrintsErrorOnFailure(t *testing.T) {
243243
assert.Contains(t, err.Error(), "create failed")
244244
}
245245

246-
func TestBrowsersDelete_SkipConfirm_Success(t *testing.T) {
246+
func TestBrowsersDelete_Success(t *testing.T) {
247247
setupStdoutCapture(t)
248248

249249
fake := &FakeBrowsersService{
@@ -255,13 +255,13 @@ func TestBrowsersDelete_SkipConfirm_Success(t *testing.T) {
255255
},
256256
}
257257
b := BrowsersCmd{browsers: fake}
258-
_ = b.Delete(context.Background(), BrowsersDeleteInput{Identifier: "any", SkipConfirm: true})
258+
_ = b.Delete(context.Background(), BrowsersDeleteInput{Identifier: "any"})
259259

260260
out := outBuf.String()
261261
assert.Contains(t, out, "Successfully deleted (or already absent) browser: any")
262262
}
263263

264-
func TestBrowsersDelete_SkipConfirm_Failure(t *testing.T) {
264+
func TestBrowsersDelete_Failure(t *testing.T) {
265265
setupStdoutCapture(t)
266266

267267
fake := &FakeBrowsersService{
@@ -273,23 +273,13 @@ func TestBrowsersDelete_SkipConfirm_Failure(t *testing.T) {
273273
},
274274
}
275275
b := BrowsersCmd{browsers: fake}
276-
err := b.Delete(context.Background(), BrowsersDeleteInput{Identifier: "any", SkipConfirm: true})
276+
err := b.Delete(context.Background(), BrowsersDeleteInput{Identifier: "any"})
277277

278278
assert.Error(t, err)
279279
errMsg := err.Error()
280280
assert.True(t, strings.Contains(errMsg, "right failed") || strings.Contains(errMsg, "left failed"), "expected error message to contain either 'right failed' or 'left failed', got: %s", errMsg)
281281
}
282282

283-
func TestBrowsersDelete_WithConfirm_NotFound(t *testing.T) {
284-
setupStdoutCapture(t)
285-
286-
fake := &FakeBrowsersService{}
287-
b := BrowsersCmd{browsers: fake}
288-
err := b.Delete(context.Background(), BrowsersDeleteInput{Identifier: "missing", SkipConfirm: false})
289-
290-
assert.Error(t, err)
291-
assert.Contains(t, err.Error(), "not found")
292-
}
293283

294284
func TestBrowsersView_ByID_PrintsURL(t *testing.T) {
295285
// Capture both pterm output and raw stdout

0 commit comments

Comments
 (0)