summaryrefslogtreecommitdiff
path: root/internal/askcli
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-22 16:03:43 +0300
committerPaul Buetow <paul@buetow.org>2026-04-22 16:03:43 +0300
commit2fe84d129c45dfc1db38a48421ac7036eb4e6337 (patch)
tree6123798e51337bcc011cea949ecaf4aebe3497b3 /internal/askcli
parent604f5aa7603498c4f7cc9a649a86d525b824e6c9 (diff)
Fix ask default add dispatch for w7
Diffstat (limited to 'internal/askcli')
-rw-r--r--internal/askcli/dispatch.go2
-rw-r--r--internal/askcli/dispatch_test.go93
2 files changed, 84 insertions, 11 deletions
diff --git a/internal/askcli/dispatch.go b/internal/askcli/dispatch.go
index e326017..cd2aae7 100644
--- a/internal/askcli/dispatch.go
+++ b/internal/askcli/dispatch.go
@@ -56,7 +56,7 @@ func (d *Dispatcher) Dispatch(ctx context.Context, args []string, stdin io.Reade
}
subcommand := args[0]
entry, ok := commandRegistry.get(subcommand)
- if !ok && scope != taskScopeAgent {
+ if !ok {
args = append([]string{"add"}, args...)
subcommand = "add"
entry, ok = commandRegistry.get(subcommand)
diff --git a/internal/askcli/dispatch_test.go b/internal/askcli/dispatch_test.go
index d8f1458..20062b0 100644
--- a/internal/askcli/dispatch_test.go
+++ b/internal/askcli/dispatch_test.go
@@ -43,19 +43,92 @@ func TestDispatcher_Help(t *testing.T) {
}
}
-func TestDispatcher_UnknownSubcommand(t *testing.T) {
- d := NewDispatcher(nil)
- var stderr bytes.Buffer
- code, err := d.Dispatch(context.Background(), []string{"foobar"}, nil, io.Discard, &stderr)
- if code != 1 {
- t.Fatalf("unknown subcommand exit code = %d, want 1", code)
+func TestDispatcher_DefaultsInvalidSubcommandToAdd(t *testing.T) {
+ dir := t.TempDir()
+ oldRoot := taskAliasCacheRoot
+ oldNow := nowTaskAliasCache
+ taskAliasCacheRoot = func() (string, error) { return filepath.Join(dir, "hexai"), nil }
+ nowTaskAliasCache = func() time.Time { return time.Date(2026, 4, 22, 12, 0, 0, 0, time.UTC) }
+ defer func() {
+ taskAliasCacheRoot = oldRoot
+ nowTaskAliasCache = oldNow
+ }()
+
+ tests := []struct {
+ name string
+ args []string
+ wantCall []string
+ wantProject string
+ }{
+ {
+ name: "plain",
+ args: []string{"foo", "bar", "baz"},
+ wantCall: []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "foo bar baz"},
+ },
+ {
+ name: "project scoped",
+ args: []string{"proj:alpha", "foo", "bar", "baz"},
+ wantCall: []string{"add", "rc.verbose=nothing", "rc.verbose=new-uuid", "foo bar baz"},
+ wantProject: "alpha",
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ var gotCall []string
+ var gotProject string
+ d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
+ gotCall = append([]string(nil), args...)
+ gotProject, _ = taskProjectFromContext(ctx)
+ _, _ = io.WriteString(stdout, "Created task uuid-default-add.\n")
+ return 0, nil
+ }})
+
+ var stdout, stderr bytes.Buffer
+ code, err := d.Dispatch(context.Background(), tc.args, nil, &stdout, &stderr)
+ if err != nil {
+ t.Fatalf("Dispatch returned error: %v", err)
+ }
+ if code != 0 {
+ t.Fatalf("Dispatch code = %d, want 0: stderr=%s", code, stderr.String())
+ }
+ if !reflect.DeepEqual(gotCall, tc.wantCall) {
+ t.Fatalf("runner args = %v, want %v", gotCall, tc.wantCall)
+ }
+ if gotProject != tc.wantProject {
+ t.Fatalf("project override = %q, want %q", gotProject, tc.wantProject)
+ }
+ if stdout.String() != "created task 0\n" {
+ t.Fatalf("stdout = %q, want created task alias", stdout.String())
+ }
+ if stderr.Len() != 0 {
+ t.Fatalf("stderr = %q, want empty", stderr.String())
+ }
+ })
}
+}
+
+func TestDispatcher_RealSubcommandsDoNotDefaultToAdd(t *testing.T) {
+ var gotCall []string
+ d := NewDispatcher(&spyRunner{runFn: func(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
+ gotCall = append([]string(nil), args...)
+ _, _ = io.WriteString(stdout, `[]`)
+ return 0, nil
+ }})
+
+ var stdout, stderr bytes.Buffer
+ code, err := d.Dispatch(context.Background(), []string{"list", "+ready"}, nil, &stdout, &stderr)
if err != nil {
- t.Fatalf("unknown subcommand returned unexpected error: %v", err)
+ t.Fatalf("Dispatch returned error: %v", err)
+ }
+ if code != 0 {
+ t.Fatalf("Dispatch code = %d, want 0: stderr=%s", code, stderr.String())
+ }
+ if want := []string{"status:pending", "+ready", "export"}; !reflect.DeepEqual(gotCall, want) {
+ t.Fatalf("runner args = %v, want %v", gotCall, want)
}
- output := stderr.String()
- if !strings.Contains(output, "unknown subcommand") {
- t.Fatalf("unknown subcommand output missing: %s", output)
+ if !strings.Contains(stdout.String(), "Description") {
+ t.Fatalf("stdout = %q, want rendered task list", stdout.String())
}
}