From 85ef4a6dd42fca271d3422ad244d6a53e9515199 Mon Sep 17 00:00:00 2001 From: Virgil Date: Wed, 1 Apr 2026 23:13:51 +0000 Subject: [PATCH] fix(agentic): reject invalid workspace clean filters Co-Authored-By: Virgil --- pkg/agentic/commands_workspace.go | 13 +++++++++++++ pkg/agentic/commands_workspace_test.go | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pkg/agentic/commands_workspace.go b/pkg/agentic/commands_workspace.go index 68cc79a..59860e0 100644 --- a/pkg/agentic/commands_workspace.go +++ b/pkg/agentic/commands_workspace.go @@ -45,6 +45,10 @@ func (s *PrepSubsystem) cmdWorkspaceClean(options core.Options) core.Result { if filter == "" { filter = "all" } + if !workspaceCleanFilterValid(filter) { + core.Print(nil, "usage: core-agent workspace clean [all|completed|failed|blocked]") + return core.Result{Value: core.E("agentic.cmdWorkspaceClean", core.Concat("unknown filter: ", filter), nil), OK: false} + } statusFiles := WorkspaceStatusPaths() var toRemove []string @@ -93,6 +97,15 @@ func (s *PrepSubsystem) cmdWorkspaceClean(options core.Options) core.Result { return core.Result{OK: true} } +func workspaceCleanFilterValid(filter string) bool { + switch filter { + case "all", "completed", "failed", "blocked": + return true + default: + return false + } +} + // input := DispatchInput{Repo: "go-io", Task: "Fix the failing tests", Issue: 12} func (s *PrepSubsystem) cmdWorkspaceDispatch(options core.Options) core.Result { input := workspaceDispatchInputFromOptions(options) diff --git a/pkg/agentic/commands_workspace_test.go b/pkg/agentic/commands_workspace_test.go index d7bfdb8..5e1bbbd 100644 --- a/pkg/agentic/commands_workspace_test.go +++ b/pkg/agentic/commands_workspace_test.go @@ -83,9 +83,12 @@ func TestCommandsworkspace_CmdWorkspaceClean_Bad_UnknownFilterLeavesEverything(t failCount: make(map[string]int), } - // Filter "unknown" matches no switch case — nothing gets removed + // Unknown filters now fail explicitly so agent callers can correct typos. r := s.cmdWorkspaceClean(core.NewOptions(core.Option{Key: "_arg", Value: "unknown"})) - assert.True(t, r.OK) + assert.False(t, r.OK) + err, ok := r.Value.(error) + assert.True(t, ok) + assert.Contains(t, err.Error(), "unknown filter: unknown") // All workspaces should still exist for _, name := range []string{"ws-done", "ws-fail", "ws-run"} {